Acronyms
ACLED Armed Conflict Location and Event Data Project
CCCM Camp Management and Camp Coordination
CSO Civil Society Organization
FAO Food and Agriculture Organization
FSC Food Security Cluster
HARP Humanitarian Assistance and Resilience Programme (DfID)
HNO Humanitarian Needs Overview
HRP Humanitarian Response Plan
IDP Internally Displaced Person
IERP Interim Emergency Response Plan
IFPRI International Food Policy Research Institute
MIMU Myanmar Information Management Unit
NNGO National Non-governmental Organization
OCHA UN Office for the Coordination of Humanitarian Affairs
UXO Unexploded Ordnance
WFP World Food Programme


Introduction

In 2021, Myanmar experienced more conflict events than any other country.

Despite existing in a state of civil war for the past 70 years, conflict in Myanmar had remained at a relatively low level when compared with the other high conflict countries, such as Syria, Yemen and Afghanistan.

However, following the military takeover on 1 February 2021, conflict in Myanmar quickly increased, and by the end of the year it had overtaken Syria as the most conflict-affected country.

While the Russia-Ukraine war in 2022 might shift Myanmar from being the most conflict-affected country, it is likely to remain a conflict hotspot. As such, a deeper exploration of conflict in Myanmar is warranted, especially as it relates to food security and food security programming.

The following report uses data from the Armed Conflict Location and Event Data Project, or ACLED, to analyse and provide an overview of the conflict situation in Myanmar and what that means for food security into the future.




About the data

The Armed Conflict Location and Event Data Project, or ACLED, captures real-time data on the locations, dates, actors, fatalities, and types of all reported political violence and protest events around the world. As of early 2022, ACLED has recorded a total of more than 1.3 million individual events globally.

ACLED has been collecting data in Myanmar since 2010. Data is updated monthly, and is collected through a review of English and Myanmar sources to code political violence and demonstration events. The majority of the information, about 85 percent, comes from subnational, national and international media sources. The remainder comes from ACLED’s partner, the Myanmar Peace Monitor, and reports from UN agencies, international monitoring groups, and local human rights organizations.

With some exceptions, this report uses 2021 data. The data is presented using terms consistent with the ACLED codebook, the foremost resource on their methodology and a useful reference for those seeking to understand more.

The excellent scholarship of the Armed Conflict Location and Event Data Project, and their dedication to making a wealth of conflict data available for free to the public must be commended. Their calls for increased protections for journalists and independent reporting should also be supported.


References for this report

1. Progressoin of conflict events in Myanmar in 2021, by interaction type

Myanmar experienced 16,263 separate conflict events in 2021, which led to 11,506 fatalities. Conflict fatalities in 2021 were more than for the previous 10 years combined.

Most conflicts in Myanmar are interactions between two groups of actors, and most of these interactions involve the Myanmar Military as one of those actors.

The map below shows the progress in of six most common conflict interaction types by **month*. Of these, four involve the Military.

The most fatal interactions in Myanmar in 2021 were those between the Military and political militia groups. Such interactions accounted for 57% of the 11,506 conflict fatalities. In comparison, interactions between the military and rebel groups accounted for 19 percent of fatalities, military versus civilian interactions for 9 percent, and political militia versus civilians for 8 percent.

The map below plots where conflict events took place across the country, by interaction type, with the size of the points indicating the number of fatalities per event.





2. Distribution of food security partners in relation to conflict events

In general, food security partners are not operating in the parts of Myanmar most affected by conflict in 2021. This is evident from the map below which plots Food Security Partners working across Myanmar against 2021 conflict events.

This lack of partners in conflict areas is especially true around Sagaing and Magway. Sagaing region experienced the most conflict in 2021, followed by Magway and Chin.

Humanitarian partners have traditionally focused on Rakhine, Kachin and northern Shan – the areas which had experienced more conflict in the past. However, a shift in the conflict dynamics in Myanmar has not yet led to a reallocation of resources to target new populations most affected by conflict. The allocation of funds away from Sagaing and Magway may also be a result of OCHA’s decision to focus on peri-urban areas under the Interim Emergency Response Plan for Myanmar which was released in June of 2021.

The distribution of Food Security Cluster partners in correlation to conflict areas is discussed in more detail in Section 6.





3. Progression and distribution of conflict events and fatalities

3.1 Conflict in Myanmar over time

Myanmar experienced a massive spike in conflict events in 2021. This sudden increase came despite the fact that Myanmar has been embroiled in a 70-year-long civil war.

In 2021, there were 16,263 conflict events in Myanmar, while in 2020 there were just 1,480. In the preceding decade, 2019 had accounted for the most conflict events, however there were only 1,811 in that year. In just two years, conflict in Myanmar increased almost tenfold.



The breakdown of conflict events in 2021 was:

2021 event types by percentage of total
Event type Count Percentage
Protests 5,973 36.73
Strategic developments 3,262 20.06
Explosions/Remote violence 2,734 16.81
Battles 2,296 14.12
Violence against civilians 1,891 11.63
Riots 107 0.66
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



3.3 Progression of conflict events in 2021

The Military takeover on 1 February led to a steady rise in battles, explosions and remote violence, and strategic developments, through to May 2021.

The incidence of these events declined briefly between June and August, before rising again in September 2021.

Protests and riots peaked in March 2021, immediately after the takeover. Events involving violence against civilians grew in frequency throughout the year, though a slight decline in intensity was noted at the end of the 2021.



It is not clear what caused a drop in the number of conflict events in June, July and August, though one hypothesis is that heavy fighting in May led to a lull in activity as actors spent time regrouping and rethinking their strategies. A possible example of this is the formation of the People’s Defence Force in May 2021.

A spike in arrests during May might have also contributed, with mass arrests diminishing the capacity of certain actors to engage in conflict. The dip in conflict also coincides with the paddy sowing period.

The table below provides a more detailed snapshot of conflicts, broken down by sub-events. Most violence against civilians was through the sub-event type labelled Attack.




3.4 Contributors to conflict fatalities

Battles and explosions and remote violence were the largest contributors to conflict fatalities in 2021.



Of concern, violence against civilians accounted for 15% of all conflict fatalities.

2021 conflict fatalities by event type
Event type Fatalities Percentage
Battles 6,540 56.84
Explosions/Remote violence 2,590 22.51
Violence against civilians 1,729 15.03
Protests 375 3.26
Riots 252 2.19
Strategic developments 20 0.17
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com


However, the event type Violence against civilians does not encompass all fatal incidents involving non-combatants. If the data is examined through the lens of interaction type, which records the types of actors involved in each conflict event, it shows that 20.14 percent of fatalities stem from interactions involving non-combatants, that is civilians and protesters. The next chapter deals with a more detailed assessment of the number of fatalities related to non-combatants.



The largest number of fatalities are related to events involving the military, political militias, including the People’s Defense Force, as well as those involving rebel groups.

2021 conflict fatalities by interaction type
Interaction type Fatalities Percentage
Military versus Political Militia 6,543 56.87
Military versus Rebels 2,163 18.80
Military versus Civilians 1,048 9.11
Political Militia versus Civilians 881 7.66
Other 469 4.08
Military versus Protesters 372 3.23
Sole Political Militia Action 30 0.26
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



3.5 Geographic distribution of conflict events in 2021



Sagaing experienced the highest number of conflict events and fatalities in 2021. Indeed, Sagaing region experienced more than three times the number of conflict-related fatalities than Magway, the next most-affected area. This represents a significant shift in the pattern of conflict in Myanmar, which has traditionally revolved around Kachin, Rakhine and Shan.




3.6 Progression of the conflict in 2021 by event type

The map below shows 2021 conflict events by month. The color of each point indicates the type of conflict event. The number of fatalities associated with each event is indicated by the size of each point. It is interesting to note that after the protests in February and March 2021, the conflict moves on to a new stage in April and May, visibly increasing in intensity.





4. Conflict and non-combatants

4.1 Conflict events involving non-combatants


Non-combatants were involved in almost one third of conflict-related fatalities in Myanmar in 2021. In total, there were 11,506 fatalities, of which 3,325 were related to non-combatants.

The map below shows conflict events labelled by ACLED as Violence against civilians and where the event was described as involving a civilian, protester, or villager.

However, protest events have been filtered out as these are generally one-sided, where the only actors involved are protesters and they do not result in property damage or death.

Events involving non-combatants are plotted on the map below, with those events that resulted in fatalities shown in red.



A breakdown of sub conflict events involving non-combatants is listed below.

Top 10 sub-event types involving non-combatants in 2021
Sub-event type Events Fatalities
Abduction/forced disappearance 140 0
Air/drone strike 17 47
Armed clash 272 929
Arrests 1,595 0
Attack 1,738 1,727
Excessive force against protesters 219 375
Looting/property destruction 611 0
Other 289 43
Protest with intervention 452 0
Remote explosive/landmine/IED 367 165
Shelling/artillery/missile attack 146 39
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



4.2 Events and fatalities involving non-combatants, by state

Most of the fatal conflict events in Myanmar in 2021 occurred in Sagaing region. In total, the region recorded 1,178 conflict-related fatalities, significantly more than in Mandalay and Yangon, the next most fatal regions. In Mandalay, there were 411 conflict-related deaths and in Yangon there were 300.


The chart above shows events and fatalities involving non-combatants, broken down by state and region.

The large number of fatalities in Sagaing, Mandalay and Yangon are due to a high rate of arrests and attacks on civilians, as shown below. However, the ratio of attacks to arrests is significantly higher in Sagaing than compared to Mandalay and Yangon.

Main sub-event types and fatalities involving non-combatants by state/region
State Arrests Attack Looting/property destruction Protest with intervention Remote explosive/landmine/IED Other Fatalities
Sagaing 250 440 237 29 52 216 1,178
Mandalay 238 304 55 68 43 78 411
Yangon 232 250 54 123 56 75 300
Magway 163 166 85 21 27 80 274
Shan-North 45 83 27 44 56 185 181
Kachin 87 72 24 36 17 95 148
Kayin 25 28 12 14 16 75 120
Kayah 24 32 11 7 6 51 117
Tanintharyi 78 72 19 16 5 30 114
Chin 27 28 28 10 12 32 112
Mon 59 69 13 16 17 27 93
Shan-South 75 49 7 18 14 64 87
Bago-East 39 40 5 7 6 22 78
Ayeyarwady 143 53 22 18 16 17 49
Bago-West 54 27 5 2 7 7 33
Rakhine 27 12 4 12 16 18 19
Naypyitaw 19 10 1 11 1 9 9
Shan-East 10 3 2 0 0 2 2
Data sources: Armed Conflict Location & Event Data Project (ACLED); acleddata.com


Kale Township in Sagaing experienced the highest rate of fatalities involving non-combatants in 2021. In total, 7 per cent of non-combatant-related fatalities occured in Kale, which represents 238 deaths. Overall, 229 townships reported fatalities involving non-combatants in 2021. Of the 20 townships with the most non-combatant fatalities, 11 were in the Sagaing Region.





5. Conflict actors

5.1 Conflict events by type of actor

The next two sections summarize conflict events and fatalities by event type and actor type.

In the plot below, faceted by type of conflict actor, shows the types of conflict events each type of actor has been involved in during 2021. For instance, political militias are most heavily involved in conflict events related to explosions and remote violence, whereas rebel groups are most involved in battles.

Because most event types, with the exception of peaceful protests, involve more than one actor, individual events appear in more than one table. For example, the same battle involving state forces and rebel groups would appear in the event count tables for each type of conflict actor. This means actual number of events is less than the total shown across all tables.



2021 number of conflict events by actor type
Actor type State_forces Protesters Civilians Political_militias Rebel_groups Rioters Identity_militias External_other_force
events 7,938 6,021 4,850 4,585 1,585 116 3 5
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



5.2 Fatalities by actor type

The tables below show the number of fatalities associated with each type of actor.

Similar to the plot above, the plot below has been faceted by actor type and shows the number of fatalities associated with a specific actor type by type of event. As these actor types are exhaustive, a specific event type can be tracked across different actors. For instance, there were 1,729 fatalities related to Violence against civilians (in green), using the plot below, one can see how many of these 1,729 fatalities the various actor types were associated with. Civilians were, of course, one of the parties involved in the Violence against civilians event type, but the other largest actors were state forces and political militias.

It should be noted that the ACLED dataset does not have a column to assign blame. For instance, under fatalities related to protests, 381 fatalities were associated with protesters, with the main other party involved almost entirely being state forces, with very small numbers being associated with rioters.



2021 number of fatalities associated with each actor type
Actor type State_forces Protesters Civilians Political_militias Rebel_groups Rioters Identity_militias External_other_force
Fatalities 9,983 373 1,871 7,363 2,184 260 3 0
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



5.3 Actors associated with the most fatalities

Conflict events between the Myanmar Military and the People’s Defense Force accounted for the greatest number of fatalities in 2021. This is significant given that the People’s Defense Force (PDF) was only created in May of last year. In total, 3,143 fatalities resulted from conflict events involving the Military and the PDF.

Conflict between civilians and the Military was the second most-likely type of conflict event to cause fatalities. In total, 966 people died from this this type of conflict.

The list below shows the number of fatalities associated with interactions between a given pair of actors. Only the top 20 pairs, in terms of fatalities, are shown. Of concern is that civilians as actors appear in the list, both in interactions with the Military and with Unidentified Armed Groups fighting military forces.

Conflict actor pairs with the highest fatalities in 2021
Actor1 Actor2 Fatalities
Military Forces of Myanmar People’s Defense Force 3,143
Civilians (Myanmar) Military Forces of Myanmar 966
Military Forces of Myanmar KIO/KIA: Kachin Independence Organization/Kachin Independence Army 709
Military Forces of Myanmar KNU/KNLA: Karen National Union/Karen National Liberation Army 681
Civilians (Myanmar) Unidentified Armed Group (Myanmar) 659
Military Forces of Myanmar CDF: Chinland Defense Force 648
Military Forces of Myanmar Protesters (Myanmar) 358
Military Forces of Myanmar MNTJP/MNDAA: Myanmar National Truth and Justice Party/Myanmar National Democratic Alliance Army 318
Military Forces of Myanmar Unidentified Local Defense Forces (Myanmar) 263
Military Forces of Myanmar YDF: Yaw Defense Force 257
Military Forces of Myanmar Rioters (Myanmar) 231
Military Forces of Myanmar KNDF: Karenni Nationalities Defense Force 212
Military Forces of Myanmar KNPP/KA: Karenni National Progressive Party/Karenni Army 197
Military Forces of Myanmar PPDF: Pale People’s Defence Force 191
Military Forces of Myanmar PRA: People’s Revolution Army 167
Unidentified Armed Group (Myanmar) Military Forces of Myanmar 145
People’s Defense Force Police Forces of Myanmar 78
Military Forces of Myanmar CDSOM: Civilians Defense Security Organization Myaung 75
Military Forces of Myanmar Zero Guerrilla Force 64
Civilians (Myanmar) People’s Defense Force 62
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com


ACLED does not collect data on the actor responsible for a fatality. This makes it impossible to distinguish whether a fatality was caused by the other actor in a conflict, or as a result of the actions of the person that dies. Despite this, it is interesting to see which actors are associated with the most fatalities, and may be considered the ‘bloodiest’.

The plot below shows the actors associated with the most fatalities, per event. Only actors who participated in more than 50 conflict events during 2021 are included.

Each point shows the average number of fatalities associated with the actor for each conflict event it participated in. The whiskers show the range of fatalities across events, with at least 95 percent of all conflict events covered within the range.

Political militias and rebel groups are associated with the highest fatality events, which is not surprising given that incidents between the People’s Defense Force and the Military resulted in the highest number of fatalities, as shown above.




5.4 Summary table of main conflict actors by actor type

Top conflict actors in 2021 by actor type
Actor type Actor name Events %_of_group
Civilians
Civilians Civilians (Myanmar) 4,844 99.88
Civilians Other 6 0.12
Identity_militias
Identity_militias Unidentified Communal Militia (Myanmar) 3 100.00
Political_militias
Political_militias Unidentified Armed Group (Myanmar) 2,299 50.14
Political_militias People’s Defense Force 1,110 24.21
Political_militias Other 772 16.84
Political_militias CDF: Chinland Defense Force 161 3.51
Political_militias Pyu Saw Htee 142 3.10
Political_militias Unidentified Local Defense Forces (Myanmar) 101 2.20
Protesters
Protesters Protesters (Myanmar) 6,021 100.00
Rebel_groups
Rebel_groups KIO/KIA: Kachin Independence Organization/Kachin Independence Army 668 42.15
Rebel_groups KNU/KNLA: Karen National Union/Karen National Liberation Army 251 15.84
Rebel_groups RCSS/SSA-S: Restoration Council of Shan State/Shan State Army-South 168 10.60
Rebel_groups MNTJP/MNDAA: Myanmar National Truth and Justice Party/Myanmar National Democratic Alliance Army 157 9.91
Rebel_groups PSLF/TNLA: Palaung State Liberation Front/Ta’ang National Liberation Army 123 7.76
Rebel_groups SSPP/SSA-N: Shan State Progress Party/Shan State Army-North 74 4.67
Rebel_groups KNPP/KA: Karenni National Progressive Party/Karenni Army 72 4.54
Rebel_groups Other 72 4.54
Rioters
Rioters Rioters (Myanmar) 116 100.00
State_forces
State_forces Military Forces of Myanmar 6,993 88.10
State_forces Police Forces of Myanmar 779 9.81
State_forces Other 166 2.09
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com



5.5 Geographic distribution of conflict actors

Sagaing is home to a huge concentration of conflict actors, with many more than in the traditional conflict areas of Kachin, northern Shan and Rakhine.





6. Correlations between conflict and food security cluster footprint

6.1 Correlation plot

Food security partners are not operating in the parts of Myanmar most affected by conflict in 2021, as shown previously in Section 2. Sagaing region experienced the most conflict in 2021, followed by Kachin and northern Shan, however humanitarian partners continue to work in Rakhine, Kachin and southern Shan, with some shift towards working in peri-urban Yangon and Mandalay.

The plot below correlates conflict indicators with the number of FSC partners and beneficiaries at township level.

The darker the color of the circle and the larger the size, is an indication of a greater the degree of correlation, with +1 being a perfect positive correlation and -1 being a perfect negative correlation.

As may be expected, conflict indicators are highly correlated with each other. What is of concern is the very weak correlation between the presence of Food Security Cluster partners and beneficiaries in relation to the incidence of conflict.



The plot below uses the same variables as above, but provides additional detail and information.

The plot is split into an upper and lower triangle, divided diagonally by the blue histograms.

The numbers in the upper triangle are the specific numeric values of the blue and yellow circles in the plot above, indicating the correlation coefficient of between +1 and –1. The asterisks denote the level of statistical significance of the correlations. The histograms show the distribution of each variable. For the conflict variables the bars are skewed to the left, indicating that most townships experienced relatively low levels of conflict.

This is borne out in an examination of the lower triangle, where each point is a township and the red line shows the linear fit between each pair of variables. Most townships tend to be concentrated around the bottom-left quadrant of the chart, with many outliers. The steeper the gradient of red line, the stronger the correlation.

For instance, the two variables most highly-correlated with each other are violence against civilians and strategic developments: they share a correlation coefficient of 0.79, meaning that in 79% of the townships in which violence against civilians occurred, strategic developments also took place (the most common strategic developments were arrests and property damage). This relationship is statistically significant, that is to say, it was not by chance that these two types of conflict events tended to occur in the same places.


The numbers of partners and beneficiaries per township were, unsurprisingly, correlated with each other. However, the number of partners per township was only slightly correlated with the number of battles and the number of explosions and remote violence – this pattern likely only holds for certain states. The number of beneficiaries reached is not correlated with any conflict indicators



6.2 Conflict score and beneficiaries reached

A conflict score, at its most basic, is an average of the normalized values of key conflict indicators. Its main use it to aid decisions about geographic prioritization. Using ACLED data, a conflict score was calculated at township level, and this is shown plotted against food security beneficiary reach in 2021. The conflict score here is an update of the conflict index in the MIMU-HARP Vulnerability Analysis, using 2021 data. The specific conflict variables that included in the score were battles, explosions and remote violence, non-peaceful protests and riots, conflict-related fatalities and strategic developments.

The spread of beneficiaries shows no discernible relationship between the incidence of conflict and the beneficiaries being reached. Please download the code here to see in detail how the conflict score was calculated.




6.3 Township-level distribution of conflict events and fatalities

Townships that experience the most conflict events and conflict-related fatalities, combined, can be considered those most affected.

The plot below shows the distribution of conflict events and fatalities by township. The townships in the upper right quadrant are the most conflict-affected, of which there are 57. While prioritization of support is necessary, it seems clear these townships should be targeted.

Further detail is provided about these townships in section 9.1.





7. Agriculture and conflict

7.1 Summary of agricultural statistics


Detailed township-level agricultural statistics for Myanmar were last made available in 2016. These statistics were included in the MIMU-HARP report Vulnerability in Myanmar.

However, the statistics are somewhat limited in value because they were collected after major floods in 2015 and were used to document losses and guide development of a national recovery plan. Many of the values related to areas harvested are anomalous. However, agricultural areas sown are unlikely to have shifted greatly in the past 6 years, indeed the sown area of paddy fields only varied by 0.1% between 2015/2016 and 2018/2019 when compared at the national level.

The plot below shows the state/regional breakdown of the total sown area in acres in 2015/2016, by major crop type.

Ayeyarwady, Sagaing, Bago and Magway contain the main agricultural production areas of Myanmar. Though Mandalay, Magway and Sagaing show a much higher diversity of crop types compared to other states/regions which are dominated by paddy rice.



The 2015/2016 agricultural data is also useful for determining the net margins per acre of crop type, and therefore the potential cost of crop losses due to conflict.

Paddy rice crops provided the lowest net margins. Areas with diverse crops enjoyed higher margins in 2015/2016.

Assuming these margins are still accurate, areas of Myanmar with greater levels of crop diversification, such as Mandalay, Magway and Sagaing, have likely suffered greater economic impacts from conflict events.


Net margin per acre of major crops (2015)
Crop type Net margin (USD) Harvested area (acres) Harvested area % Margin per acre (USD)
Maize 351,623,671 1,144,769 3.48 307
Green Gram 686,210,129 2,915,748 8.87 235
Pigeon Pea 375,384,475 1,596,547 4.85 235
Groundnut 302,247,466 2,305,150 7.01 131
Urad Pea 293,636,574 2,717,568 8.26 108
Sesame 319,141,771 3,904,036 11.87 82
Paddy 1,176,706,195 17,367,234 52.81 68
Data source: Ministry of Agriculture, Livestock and Irrigation (2015/2016)



7.2 Conflict score and agriculture

Conflict has a real effect on food prices, as demonstrated by the International Food Policy Research Institute (IFPRI) in their working paper Agricultural value chains in a fragile state: the case of rice in Myanmar.

IFPRI noted that whilst neither paddy nor milled rice (100 kg of harvested paddy yields about 68 kg milled rice, which is then sold on to retailers) had seen any major price changes after the military takeover, the retail price of rice has been noticeably higher. Surveyed food vendors also reported experiencing a steep increase in “local farmer supply difficulties” and “outside village supply difficulties”.

This indicates that the conflict is impacting agricultural supply chains and prices. In total, retail rice prices have increased 11 per cent since the military takeover. IFPRI noted that 10 additional violent events in the month-of and month before a price measurement was associated with a 1 and 2 percent increase in price dispersion, respectively, at the mill and vendor levels. As IFPRI reported, “the impact of 10 violent events is approximately equivalent to 167-333 km of distance between mills and vendors”.

The treemap below shows the intersection of acres of land sown and the conflict score calculated from ACLED data. Townships are represented by the smaller rectangles and are grouped by state/region. The amount of agricultural area sown in a state or region is reflected by the size of the larger rectangles. The severity of conflict in a township is indicated by its color.

Sagaing and Magway are two of the top areas in Myanmar for agricultural production, and their townships were most affected by conflict in 2021. Agricultural areas in Ayeyarwady, Bago, Yangon, Rakhine and Shan (East) have been less affected by conflict events and fatalities, indicating that access to fields and markets not been disrupted and existing livelihoods programme designs may be sufficient in these areas.

Ensuring food security in Sagaing, Magway, Mandalay, Mon, Kayin, Kachin and Kayah, livelihood programming should be predicated on safe access to agricultural land and markets. While a more thorough analysis of market access in these areas is warranted, facilitating access between producers, millers and vendors would contribute to the stabilization of prices. There is also a need for mine-risk education as many areas might be contaminated by UXOs. For reference, the map in section 3.4 to see where explosions and remote violence have occurred.



The next treemap uses the same area scale as above, but the colors of each township have been changed to reflect the net margins earned from agricultural production in 2015/2016.

While Ayeyarwady had the largest cultivated area of all the states and regions, its share of the net margins per acre tended to be lower than in many other parts of the country. This is largely due to the much higher levels of crop diversification in Magway and Sagaing or rather, the predominance of paddy cultivation in Ayeyarwady. Despite the anomalous post-flood data from 2015/2016, this shows the areas of Sagaing and Magway have the most to lose in relation to conflict and crop losses or damage.




7.3 Maps of conflict events, fatalities and agricultural area sown

Click here to see interactive versions of these maps. Please note the maps are large and will take a long time to load. Static versions are below.




8. Text mining conflict event descriptions

8.1 Network graph of conflict descriptions

ACLED data catalogued 16,263 conflict events in Myanmar in 2021. For each event, a series of notes is logged, which contain a description of the event. The descriptions include information on the location of the conflict, the actors involved, and the immediate impact. A sample of conflict event descriptions from the ACLED dataset are shown below. To better understand the data, each descriptive paragraph was broken down by individual words to better identify key words and the relationships between them.

Examples of conflict descriptions from the ACLED dataset
data_id notes
7695728 On 9 February 2021, in Khaing Sein village, Mongtong village tract, Hsipaw township, Kyaukme district, Shan state, the military and RCSS/SSA-S clashed. Myanmar military 22, 243 LIB and 567 LID were involved. Another clash was reported in Pang Hkar village.
7761223 Displacement: Around 16 March 2021 (as reported), in Hpapun township (Hpapun District, Kayin State), about 800 villagers from two villages fled their villages after the Myanmar military fired artillery shells into the villages and burned rice fields.
8655424 On 17 November 2021, in Yesagyo town (Yesagyo township, Pakokku district, Magway region), a parcel bomb exploded at the home of a NLD activist when opened the parcel thrown by two motorcyclists in front of the home in No (1) Htin Tan ward. The activist, his wife, his daughter and one neighbor were killed. Locals speculated that the leader of the Pyu Saw Htee group (also a military informant) and military forces jointly assassinated them.
Data source: Armed Conflict Location & Event Data Project (ACLED); acleddata.com


When the conflict description key words are mapped onto a network graph, as below, clusters of words become apparent. Only those words that appeared in at least 70 conflict descriptions, and had a correlation of above 0.2 with at least one other word were mapped. There are fours clusters of words of note. The first centers around the word protests, the second around protest-related words, the third around remote, controlled and explosives, and the fourth around Kachin township names.


conflict network graph Click here to see the full-sized graph.


The first cluster centers on the word protests. The word is closely linked to other words including coup and disobedience. Linked to this cluster is a second which contains the words live, rubber, bullets, disperse and crowd. It is easily surmised these words relate to conflict events surrounding the February 2021 military takeover and the mass demonstrations in response. Indeed, the word February is also closely linked with both clusters.

Another cluster of note centers around the words remote, controlled and explosives. The cluster is closely linked to a second series of words, including convoy, trucks and landmines. These word are likely linked to events where military convoys were bombed and ambushed by the People’s Defence Forces.

There is also a Kachin cluster of words, centered around the township names of Myitkyina, Waingmaw, Monhyin, Hpakant, Bhamo, as well as KIA, the acronym for the Kachin Independence Army. Noticeably, this cluster also has links with the words battalion, jet and fighters.

The plots below show the top 20 words associated with each type of conflict event. These plots provide an alternative way of reading or interpreting the word data. Of interest, the word clashed is most likely to appear in descriptions of battles, while the word coup is more likely to appear in descriptions of protest events.




8.2 Pairwise correlations

To further interrogate the ACLED conflict descriptions, correlations between individual words were also assessed. When a particular word is of interest, it may be useful to see its most likely word pair.

The table below shows the 20 most common word pairings, where each word has appeared in an ACLED conflict description at least 50 times. A correlation of 1 means that the word always appears with its match in the dataset; a correlation of 0.5 means that the word appears in the same event as its match 50 percent of the time.

You can use the filter above the column word to see different word pairings. We suggest starting with artillery, protest, landmine or a location of interest to see how the pairings change. The search bar will search in both columns and so may prove less useful than the filter function.




8.3 Fatalities and word correlations

Another way to interpret the ACLED description data through word associations, is to look at the words used to describe conflict events that resulted in fatalities.

The plots below show the top 30 words associated with conflict events that either resulted in fatalities (shown in red), or did not (shown in blue).

In each plot, the most common words are ranked in terms of how often they are used to describe a conflict event that did or did not result in fatalities.

Of interest, when a fatal conflict is described, the description most often uses the words shot, soldiers, injured, PDF and military. In contrast, the words displacement, change, formed, arrested and offices were most likely to be used to describe events that did not result in fatalities.

An interesting next step in understanding the descriptive data might be to try and develop a predictive model based on the conflict descriptions to better understand which types of events are more likely to result in fatalities.




8.4 Sources used by the ACLED dataset

In most cases, the ACLED dataset’s descriptions of each conflict event comes from news sources.

A total of 67 news sources were used in the ACLED Myanmar dataset. About one third of the conflict events included in the ACLED dataset for 2021 were originally reported in the Democratic Voice of Burma. The most common news sources are listed in the table below. They are ranked by order of the share of 2021 conflict events attributed to them.



As a point of comparison, ACLED’s methodology and dataset was discussed with the Nexus Response Mechanism’s (NRM) Conflict Analysis and Research Facility, which also maintains its own dataset of conflict events. It was noted that the two datasets are very similar, both relying largely on media sources, with the only exception being the inclusion of social media posts in the NRM dataset. The FSC will continue to use ACLED data for analysis going forward as it is free and publicly available.




9. Next steps

The ACLED data is an important source of data for better understanding the scope nature of conflict in Myanmar. However, more can be done to interrogate how conflict impacts food security in the country. Furthermore, the incidence of conflict, to-date, has not been taken into account when allocating resources in food security programming and it is important to ensure that the data presented in this report are used to inform programmatic and operational decision making.

To better understand impact of conflict on food security, the following steps are recommended.

  1. Review all findings with other humanitarian stakeholders and develop area-specific products, as necessary. The conflict score that has been calculated is an important tool for geographic prioritization and food security partners should be oriented on its use. The data used to generate the conflict score is both easily accessible and regularly updated, though it remains to be seen to what extent this is true for data on displacement.

  2. Re-calculate the conflict score once updated IDP data is obtained and compare these results to previous results recorded by MIMU-HARP in their vulnerability analysis. To note, displacement is likely to be highly correlated with the other conflict indicators (this was the case with the MIMU-HARP conflict index). Nevertheless, it was a key component of the MIMU-HARP model and its inclusion will aid in improving comparability.

  3. Compare conflict scores and conflict indicators to the results of the WFP-FAO food insecurity survey. It will be important to understand if there are any significant correlations between the scores and results. Further, the two datasets could be filtered to only include time periods relevant to the WFP-FAO study. Additionally, conflict scores could be cross-referenced with market prices to see if a predictive model can be established. Conflict data should also be mapped against data on malnutrition. While there will likely be many challenges in obtaining accurate mortality rates, the impact of conflict on malnutrition should be better understood.

  4. Compare conflict indicators to market prices to whether conflict events have had an impact on food prices and price stability. Again, a predictive model could be developed from this comparison.

  5. Compare ACLED data against MIMU’s hard-to-reach areas dataset.

  6. Cross-reference conflict data with partner presence and achievements of other clusters.




10. Reference maps and tables

10.1 Conflict events in 2021 aggregated at township level



10.2 Conflict actors in 2021



10.3 Reference maps

Interactive versions of some of these maps can be found here. Please note that the maps are large and will take a long time to load.

LS0tDQp0aXRsZTogIlVuZGVyc3RhbmRpbmcgQ29uZmxpY3QgRHluYW1pY3MgaW4gTXlhbm1hciB0aHJvdWdoIENvbmZsaWN0IGFuZCBJbmNpZGVudCBEYXRhOiBBIEZvb2QgU2VjdXJpdHkgUGVyc3BlY3RpdmUiDQphdXRob3I6ICJNeWFubWFyIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciINCmRhdGU6ICIxMS8wMi8yMDIyIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGNvbGxhcHNlZDogZmFsc2UNCmFsd2F5c19hbGxvd19odG1sOiB0cnVlICAgDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIk15YW5tYXJfY2x1c3Rlcl9ibHVlLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQpgYGB7ciB0YWJsZS1hY3JvbnltcywgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCnRyaWJibGUoDQogIH5hY3JvbnltLCB+bmFtZSwgDQogICJBQ0xFRCIsICJBcm1lZCBDb25mbGljdCBMb2NhdGlvbiBhbmQgRXZlbnQgRGF0YSBQcm9qZWN0IiwNCiAgIkNDQ00iLCAiQ2FtcCBNYW5hZ2VtZW50IGFuZCBDYW1wIENvb3JkaW5hdGlvbiIsDQogICJDU08iLCAiQ2l2aWwgU29jaWV0eSBPcmdhbml6YXRpb24iLA0KICAiRkFPIiwgIkZvb2QgYW5kIEFncmljdWx0dXJlIE9yZ2FuaXphdGlvbiIsDQogICJGU0MiLCAiRm9vZCBTZWN1cml0eSBDbHVzdGVyIiwNCiAgIkhBUlAiLCAiSHVtYW5pdGFyaWFuIEFzc2lzdGFuY2UgYW5kIFJlc2lsaWVuY2UgUHJvZ3JhbW1lIChEZklEKSIsDQogICJITk8iLCAiSHVtYW5pdGFyaWFuIE5lZWRzIE92ZXJ2aWV3IiwNCiAgIkhSUCIsICJIdW1hbml0YXJpYW4gUmVzcG9uc2UgUGxhbiIsDQogICJJRFAiLCAiSW50ZXJuYWxseSBEaXNwbGFjZWQgUGVyc29uIiwgDQogICJJRVJQIiwgIkludGVyaW0gRW1lcmdlbmN5IFJlc3BvbnNlIFBsYW4iLA0KICAiSUZQUkkiLCAiSW50ZXJuYXRpb25hbCBGb29kIFBvbGljeSBSZXNlYXJjaCBJbnN0aXR1dGUiLA0KICAiTUlNVSIsICJNeWFubWFyIEluZm9ybWF0aW9uIE1hbmFnZW1lbnQgVW5pdCIsDQogICJOTkdPIiwgIk5hdGlvbmFsIE5vbi1nb3Zlcm5tZW50YWwgT3JnYW5pemF0aW9uIiwgDQogICJPQ0hBIiwgIlVOIE9mZmljZSBmb3IgdGhlIENvb3JkaW5hdGlvbiBvZiBIdW1hbml0YXJpYW4gQWZmYWlycyIsDQogICJVWE8iLCAiVW5leHBsb2RlZCBPcmRuYW5jZSIsDQogICJXRlAiLCAiV29ybGQgRm9vZCBQcm9ncmFtbWUiDQopICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICIqKkFjcm9ueW1zKioiLCBjb2wubmFtZXMgPSBOVUxMKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMihwb3NpdGlvbiA9ICJsZWZ0IiwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNCjxicj4NCg0KIyMgSW50cm9kdWN0aW9uDQoNCkluIDIwMjEsIE15YW5tYXIgZXhwZXJpZW5jZWQgbW9yZSBjb25mbGljdCBldmVudHMgdGhhbiBhbnkgb3RoZXIgY291bnRyeS4NCg0KRGVzcGl0ZSBleGlzdGluZyBpbiBhIHN0YXRlIG9mIGNpdmlsIHdhciBmb3IgdGhlIHBhc3QgNzAgeWVhcnMsIGNvbmZsaWN0IGluIE15YW5tYXIgaGFkIHJlbWFpbmVkIGF0IGEgcmVsYXRpdmVseSBsb3cgbGV2ZWwgd2hlbiBjb21wYXJlZCB3aXRoIHRoZSBvdGhlciBoaWdoIGNvbmZsaWN0IGNvdW50cmllcywgc3VjaCBhcyBTeXJpYSwgWWVtZW4gYW5kIEFmZ2hhbmlzdGFuLg0KDQpIb3dldmVyLCBmb2xsb3dpbmcgdGhlIG1pbGl0YXJ5IHRha2VvdmVyIG9uIDEgRmVicnVhcnkgMjAyMSwgY29uZmxpY3QgaW4gTXlhbm1hciBxdWlja2x5IGluY3JlYXNlZCwgYW5kIGJ5IHRoZSBlbmQgb2YgdGhlIHllYXIgaXQgaGFkIG92ZXJ0YWtlbiBTeXJpYSBhcyB0aGUgbW9zdCBjb25mbGljdC1hZmZlY3RlZCBjb3VudHJ5Lg0KDQpXaGlsZSB0aGUgUnVzc2lhLVVrcmFpbmUgd2FyIGluIDIwMjIgbWlnaHQgc2hpZnQgTXlhbm1hciBmcm9tIGJlaW5nIHRoZSBtb3N0IGNvbmZsaWN0LWFmZmVjdGVkIGNvdW50cnksIGl0IGlzIGxpa2VseSB0byByZW1haW4gYSBjb25mbGljdCBob3RzcG90LiBBcyBzdWNoLCBhIGRlZXBlciBleHBsb3JhdGlvbiBvZiBjb25mbGljdCBpbiBNeWFubWFyIGlzIHdhcnJhbnRlZCwgZXNwZWNpYWxseSBhcyBpdCByZWxhdGVzIHRvIGZvb2Qgc2VjdXJpdHkgYW5kIGZvb2Qgc2VjdXJpdHkgcHJvZ3JhbW1pbmcuDQoNClRoZSBmb2xsb3dpbmcgcmVwb3J0IHVzZXMgZGF0YSBmcm9tIHRoZSBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiBhbmQgRXZlbnQgRGF0YSBQcm9qZWN0LCBvciBBQ0xFRCwgdG8gYW5hbHlzZSBhbmQgcHJvdmlkZSBhbiBvdmVydmlldyBvZiB0aGUgY29uZmxpY3Qgc2l0dWF0aW9uIGluIE15YW5tYXIgYW5kIHdoYXQgdGhhdCBtZWFucyBmb3IgZm9vZCBzZWN1cml0eSBpbnRvIHRoZSBmdXR1cmUuDQoNCjxicj4NCg0KIVtdKGFsbF9hY2xlZF8yMDEwXzIwMjEucG5nKQ0KDQo8YnI+PGJyPg0KDQojIyMgQWJvdXQgdGhlIGRhdGENCg0KVGhlIEFybWVkIENvbmZsaWN0IExvY2F0aW9uIGFuZCBFdmVudCBEYXRhIFByb2plY3QsIG9yIEFDTEVELCBjYXB0dXJlcyByZWFsLXRpbWUgZGF0YSBvbiB0aGUgbG9jYXRpb25zLCBkYXRlcywgYWN0b3JzLCBmYXRhbGl0aWVzLCBhbmQgdHlwZXMgb2YgYWxsIHJlcG9ydGVkIHBvbGl0aWNhbCB2aW9sZW5jZSBhbmQgcHJvdGVzdCBldmVudHMgYXJvdW5kIHRoZSB3b3JsZC4gQXMgb2YgZWFybHkgMjAyMiwgQUNMRUQgaGFzIHJlY29yZGVkIGEgdG90YWwgb2YgbW9yZSB0aGFuIDEuMyBtaWxsaW9uIGluZGl2aWR1YWwgZXZlbnRzIGdsb2JhbGx5Lg0KDQpBQ0xFRCBoYXMgYmVlbiBjb2xsZWN0aW5nIGRhdGEgaW4gTXlhbm1hciBzaW5jZSAyMDEwLiBEYXRhIGlzIHVwZGF0ZWQgbW9udGhseSwgYW5kIGlzIGNvbGxlY3RlZCB0aHJvdWdoIGEgcmV2aWV3IG9mIEVuZ2xpc2ggYW5kIE15YW5tYXIgc291cmNlcyB0byBjb2RlIHBvbGl0aWNhbCB2aW9sZW5jZSBhbmQgZGVtb25zdHJhdGlvbiBldmVudHMuIFRoZSBtYWpvcml0eSBvZiB0aGUgaW5mb3JtYXRpb24sIGFib3V0IDg1IHBlcmNlbnQsIGNvbWVzIGZyb20gc3VibmF0aW9uYWwsIG5hdGlvbmFsIGFuZCBpbnRlcm5hdGlvbmFsIG1lZGlhIHNvdXJjZXMuIFRoZSByZW1haW5kZXIgY29tZXMgZnJvbSBBQ0xFROKAmXMgcGFydG5lciwgdGhlIE15YW5tYXIgUGVhY2UgTW9uaXRvciwgYW5kIHJlcG9ydHMgZnJvbSBVTiBhZ2VuY2llcywgaW50ZXJuYXRpb25hbCBtb25pdG9yaW5nIGdyb3VwcywgYW5kIGxvY2FsIGh1bWFuIHJpZ2h0cyBvcmdhbml6YXRpb25zLiANCg0KV2l0aCBzb21lIGV4Y2VwdGlvbnMsIHRoaXMgcmVwb3J0IHVzZXMgMjAyMSBkYXRhLiBUaGUgZGF0YSBpcyBwcmVzZW50ZWQgdXNpbmcgdGVybXMgY29uc2lzdGVudCB3aXRoIHRoZSBBQ0xFRCBjb2RlYm9vaywgdGhlIGZvcmVtb3N0IHJlc291cmNlIG9uIHRoZWlyIG1ldGhvZG9sb2d5IGFuZCBhIHVzZWZ1bCByZWZlcmVuY2UgZm9yIHRob3NlIHNlZWtpbmcgdG8gdW5kZXJzdGFuZCBtb3JlLiANCiANClRoZSBleGNlbGxlbnQgc2Nob2xhcnNoaXAgb2YgdGhlIEFybWVkIENvbmZsaWN0IExvY2F0aW9uIGFuZCBFdmVudCBEYXRhIFByb2plY3QsIGFuZCB0aGVpciBkZWRpY2F0aW9uIHRvIG1ha2luZyBhIHdlYWx0aCBvZiBjb25mbGljdCBkYXRhIGF2YWlsYWJsZSBmb3IgZnJlZSB0byB0aGUgcHVibGljIG11c3QgYmUgY29tbWVuZGVkLiBUaGVpciBjYWxscyBmb3IgaW5jcmVhc2VkIHByb3RlY3Rpb25zIGZvciBqb3VybmFsaXN0cyBhbmQgaW5kZXBlbmRlbnQgcmVwb3J0aW5nIHNob3VsZCBhbHNvIGJlIHN1cHBvcnRlZC4NCg0KDQo8YnI+DQoNCiMjIyBSZWZlcmVuY2VzIGZvciB0aGlzIHJlcG9ydA0KKiBBQ0xFRCwgKDIwMTkpLiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpIENvZGVib29rLiBodHRwczovL3d3dy5hY2xlZGRhdGEuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy9kbG1fdXBsb2Fkcy8yMDE3LzEwL0FDTEVEX0NvZGVib29rXzIwMTlGSU5BTF9wYmwucGRmLg0KKiBBQ0xFRCwgKDIwMjIpLiBBQ0xFRCBkYXRhIGZvciBNeWFubWFyICgyMDEwLTIwMjIpLiBodHRwczovL2FjbGVkZGF0YS5jb20uDQoqIEFDTEVELCAoMjAyMCkuIEFDTEVEIE1ldGhvZG9sb2d5IGFuZCBDb2RpbmcgRGVjaXNpb25zIGFyb3VuZCBQb2xpdGljYWwgVmlvbGVuY2UgaW4gTXlhbm1hci4gaHR0cHM6Ly9hY2xlZGRhdGEuY29tL2FjbGVkZGF0YW5ldy93cC1jb250ZW50L3VwbG9hZHMvMjAyMS8xMS9BQ0xFRF9Qb2xpdGljYWwtVmlvbGVuY2UtaW4tTXlhbm1hcl9GZWJydWFyeS0yMDIwLnBkZi4NCiogQXRpbGxpbyBCZW5pbmksIEFsZG8gQmVuaW5pICgyMDIxKS4gbWRlcHJpdjogU3ludGhldGljIHNjb3JlcyBvZiBtdWx0aXBsZSBkZXByaXZhdGlvbi4gUiBwYWNrYWdlIHZlcnNpb24gMC4wLjMuICBodHRwczovL2dpdGh1Yi5jb20vYS1iZW5pbmkvbWRlcHJpdi8uDQoqIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciwgTXlhbm1hciAoMjAyMSkuIDVXcyByZXBvcnRpbmcgdG9vbC4NCiogSEFSUC1GIGFuZCBNSU1VICgyMDE4KS4gVnVsbmVyYWJpbGl0eSBpbiBNeWFubWFyOiBBIFNlY29uZGFyeSBEYXRhIFJldmlldyBvZiBOZWVkcywgQ292ZXJhZ2UgYW5kIEdhcHMuIGh0dHA6Ly90aGVtaW11LmluZm8vdnVsbmVyYWJpbGl0eS1pbi1teWFubWFyLg0KKiBJRlBSSSAoMjAyMikuIEFncmljdWx0dXJhbCB2YWx1ZSBjaGFpbnMgaW4gYSBmcmFnaWxlIHN0YXRlOiB0aGUgY2FzZSBvZiByaWNlIGluIE15YW5tYXIuIGh0dHBzOi8vd3d3LmlmcHJpLm9yZy9wdWJsaWNhdGlvbi9hZ3JpY3VsdHVyYWwtdmFsdWUtY2hhaW5zLWZyYWdpbGUtc3RhdGUtY2FzZS1yaWNlLW15YW5tYXIuDQoqIFNpbGdlIEosIFJvYmluc29uIEQgKDIwMTYpLiB0aWR5dGV4dDogVGV4dCBNaW5pbmcgYW5kIEFuYWx5c2lzIFVzaW5nIFRpZHkgRGF0YSBQcmluY2lwbGVzIGluIFIuIEpPU1MsIDEoMykuIGRvaTogMTAuMjExMDUvam9zcy4wMDAzNywgaHR0cDovL2R4LmRvaS5vcmcvMTAuMjExMDUvam9zcy4wMDAzNy4NCjxicj48YnI+PGJyPg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RyaW5naSkNCmxpYnJhcnkocGFuZGVyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShmdXp6eWpvaW4pDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShzMikNCmxpYnJhcnkoYm9va2Rvd24pDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KGdnc2ZsYWJlbCkNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeSh3aWR5cikNCmxpYnJhcnkoZ2dhbmltYXRlKQ0KbGlicmFyeShnaWZza2kpDQpsaWJyYXJ5KHBuZykNCmxpYnJhcnkodHJhbnNmb3JtcikNCmxpYnJhcnkobWRlcHJpdikNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KHh0YWJsZSkNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KHRpZHl0ZXh0KQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KbGlicmFyeSh0cmVlbWFwKQ0KbGlicmFyeSh0cmVlbWFwaWZ5KQ0KbGlicmFyeSh0aWR5bG8pDQoNCnRoZW1lX3NldCh0aGVtZV9saWdodCgpKQ0KDQojIGRpc2FibGluZyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHNjaXBlbiA9IDk5OSkNCg0KIyBwYW5kZXIgdGFibGVzIGFsbCBpbiBvbmUgcm93DQpwYW5kZXJPcHRpb25zKCd0YWJsZS5zcGxpdC50YWJsZScsIEluZikNCg0KIyBwYW5kZXIgdGhvdXNhbmRzIHNlcGFyYXRvcg0KcGFuZGVyT3B0aW9ucygiYmlnLm1hcmsiLCAiLCIpDQoNCiMgcmVwbGFjZSANCm9wdHMgPC0gb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICIiKQ0KDQpgJW91dCVgIDwtIE5lZ2F0ZShgJWluJWApDQoNCiMgZnVuY3Rpb24gZm9yIHRyYW5zcG9zaW5nIGRmDQp0cmFuc3Bvc2VfZGYgPC0gZnVuY3Rpb24oZGYpIHsNCiAgdF9kZiA8LSBkYXRhLnRhYmxlOjp0cmFuc3Bvc2UoZGYpDQogIGNvbG5hbWVzKHRfZGYpIDwtIHJvd25hbWVzKGRmKQ0KICByb3duYW1lcyh0X2RmKSA8LSBjb2xuYW1lcyhkZikNCiAgdF9kZiA8LSB0X2RmICU+JQ0KICAgIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKC5kYXRhID0gLikgJT4lDQogICAgdGliYmxlOjphc190aWJibGUoLikNCiAgcmV0dXJuKHRfZGYpDQp9DQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzDQpzdW1fYmVuIDwtIGZ1bmN0aW9uKGRmLCBjb2x1bW5fdmFyKXsNCiAgDQogIGNvbHVtbl92YXIgPC0gZW5xdW8oY29sdW1uX3ZhcikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcikgJT4lICMgbXVzdCBhZGQgYmFuZy1iYW5nDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpDQogICAgDQp9DQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzLCAyIGdyb3VwZWQgdmFyaWFibGVzDQpzdW1fYmVuMiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3ZhcjEsIGNvbHVtbl92YXIyKXsNCiAgDQogIGNvbHVtbl92YXIxIDwtIGVucXVvKGNvbHVtbl92YXIxKQ0KICBjb2x1bW5fdmFyMiA8LSBlbnF1byhjb2x1bW5fdmFyMikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcjEsICEhY29sdW1uX3ZhcjIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIGN1bXVhbHRpdmUgY291bnQNCmN1bWNvdW50IDwtIGZ1bmN0aW9uKHgpew0KICBjdW1jb3VudCA8LSBudW1lcmljKGxlbmd0aCh4KSkNCiAgbmFtZXMoY3VtY291bnQpIDwtIHgNCg0KICBmb3IoaSBpbiAxOmxlbmd0aCh4KSl7DQogICAgY3VtY291bnRbaV0gPC0gc3VtKHhbMTppXT09eFtpXSkNCiAgfQ0KDQogIHJldHVybihjdW1jb3VudCkNCn0NCg0KIyByZWFkaW5nIGluIHRvd25zaGlwcyBmcm9tIGdlb2FkbWlucyANCnRvd25zaGlwcyA8LSByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwNCiAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgc2VsZWN0KGFkbWluMXBjb2RlXzQ6YWRtaW4zcGNvZGUpICU+JSANCiAgcmVuYW1lKGFkbWluMV9wY29kZSA9IGFkbWluMXBjb2RlXzQsDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBhZG1pbjNwY29kZSwNCiAgICAgICAgIHN0YXRlX25hbWUgICA9IHN0YXRlXzUsDQogICAgICAgICB0b3duc2hpcF9uYW1lICA9IGNvdW50eSkgJT4lIA0KICByZW1vdmVfZW1wdHkoKSAlPiUgDQogIG11dGF0ZShhZG1pbjNfcGNvZGUgPSBpZmVsc2Uoc3RhdGVfbmFtZSA9PSAiTWFnd2F5IiAmIHRvd25zaGlwX25hbWUgPT0gIk1pbmhsYSIsICJNTVIwMDkwMTMiLCBhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgYWRtaW4zX3Bjb2RlID0gaWZlbHNlKHN0YXRlX25hbWUgPT0gIllhbmdvbiIgJiB0b3duc2hpcF9uYW1lID09ICJIdGFudGFiaW4iLCAiTU1SMDEzMDA2IiwgYWRtaW4zX3Bjb2RlKSkNCg0KIyByZWFkaW5nIGluIGFjbGVkDQphY2xlZCA8LSByZWFkX2V4Y2VsKCIyMDEwLTAxLTAxLTIwMjItMDEtMjUtTXlhbm1hci54bHN4IiwgDQogICAgICAgICBzaGVldCA9ICIyMDEwLTIwMjEtQ2xlYW5lZCIpICU+JSANCiAgbXV0YXRlKGFkbWluMyA9IHJlY29kZShhZG1pbjMsDQogICAgICAgICAgICAgICAgICAgICAgICAiRGFnb24gTXlvdGhpdC1Tb3V0aCIgPSAiRGFnb24gTXlvdGhpdCAoU291dGgpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJEYWdvbiBNeW90aGl0LU5vcnRoIiA9ICJEYWdvbiBNeW90aGl0IChOb3J0aCkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkRhZ29uIE15b3RoaXQtU2Vpa2thbiIgPSAiRGFnb24gTXlvdGhpdCAoU2Vpa2thbikiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkRhZ29uIE15b3RoaXQtRWFzdCIgPSAiRGFnb24gTXlvdGhpdCAoRWFzdCkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkhsYWluZ3RoYXJ5YS1FYXN0IiA9ICJIbGFpbmd0aGFyeWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkhsYWluZ3RoYXJ5YS1XZXN0IiA9ICJIbGFpbmd0aGFyeWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIlBhbmdzYW5nIiA9ICJQYW5nc2FuZyAoUGFuZ2hrYW0pIikpICU+JSANCiAgIyBsb2NhdGlvbnMgaW4geWFuZ29uIHdpdGggbG9uZ2xhdCwgYnV0IG5vIGFkbWluMyBoYXZlIGJlZW4gY29kZWQgYXMgS3lhdWt0YWRhLCB3aGVyZSBjaXR5IGhhbGwgaXM7DQogICMgc2ltaWxhcmx5LCBpbiBtYW5kYWxheSwgdGhleSBoYXZlIGJlZW4gcGxhY2VkIGluIENoYW5heWV0aGF6YW4gYW5kIFpheSB5YXIgdGhpIHJpIGluIE5QVA0KICBtdXRhdGUoYWRtaW4zID0gY2FzZV93aGVuKGlzLm5hKGFkbWluMykgJiBsYXRpdHVkZSA9PSAxNi44MDUyIH4gIkt5YXVrdGFkYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShhZG1pbjMpICYgbGF0aXR1ZGUgPT0gMTkuNzQ1MCB+ICJaYXkgWWFyIFRoaSBSaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShhZG1pbjMpICYgbGF0aXR1ZGUgPT0gMjEuOTc0NyB+ICJDaGFuYXlldGhhemFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBhZG1pbjMpKSAlPiUgDQogIGxlZnRfam9pbih0b3duc2hpcHMgJT4lICANCiAgICAgICAgICAgICAgc2VsZWN0KHRvd25zaGlwX25hbWUsIGFkbWluM19wY29kZSksIGJ5ID0gYygiYWRtaW4zIiA9ICJ0b3duc2hpcF9uYW1lIikpICU+JSANCiAgZ3JvdXBfYnkoZGF0YV9pZCkgJT4lIA0KICBzbGljZSh3aGljaC5taW4oZXZlbnRfaWRfbm9fY250eSkpICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoaW50ZXJfdHlwZSA9IGludGVyYWN0aW9uLA0KICAgICAgICAgaW50ZXJfdHlwZSA9IHJlY29kZV9mYWN0b3IoaW50ZXJfdHlwZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDEwYCA9ICJTT0xFCU1JTElUQVJZIEFDVElPTiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxMWAgPSAiTUlMSVRBUlkgVkVSU1VTIE1JTElUQVJZIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDEyYCA9ICJNSUxJVEFSWSBWRVJTVVMgUkVCRUxTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDEzYCA9ICJNSUxJVEFSWSBWRVJTVVMgUE9MSVRJQ0FMIE1JTElUSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMTRgID0gIk1JTElUQVJZIFZFUlNVUyBDT01NVU5BTCBNSUxJVElBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDE1YCA9ICJNSUxJVEFSWSBWRVJTVVMgUklPVEVSUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAxNmAgPSAiTUlMSVRBUlkgVkVSU1VTIFBST1RFU1RFUlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMTdgID0gIk1JTElUQVJZIFZFUlNVUyBDSVZJTElBTlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMThgID0gIk1JTElUQVJZIFZFUlNVUyBPVEhFUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyMGAgPSAiU09MRSBSRUJFTCBBQ1RJT04iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMjJgID0gIlJFQkVMUyBWRVJTVVMgUkVCRUxTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDIzYCA9ICJSRUJFTFMJVkVSU1VTIFBPTElUSUNBTCBNSUxJSVRBICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyNGAgPSAiUkVCRUxTIFZFUlNVUyBDT01NVU5BTCBNSUxJVElBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDI1YCA9ICJSRUJFTFMgVkVSU1VTIFJJT1RFUlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMjZgID0gIlJFQkVMUyBWRVJTVVMgUFJPVEVTVEVSUyAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMjdgID0gIlJFQkVMUyBWRVJTVVMgQ0lWSUxJQU5TIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDI4YCA9ICJSRUJFTFMgVkVSU1VTIE9USEVSUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzMGAgPSAiU09MRSBQT0xJVElDQUwgTUlMSVRJQSBBQ1RJT04iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMzNgID0gIlBPTElUSUNBTCBNSUxJVElBIFZFUlNVUyBQT0xJVElDQUwJTUlMSVRJQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzNGAgPSAiUE9MSVRJQ0FMIE1JTElUSUEgVkVSU1VTIENPTU1VTkFMCU1JTElUSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgMzVgID0gIlBPTElUSUNBTCBNSUxJVElBIFZFUlNVUyBSSU9URVJTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDM2YCA9ICJQT0xJVElDQUwgTUlMSVRJQSBWRVJTVVMgUFJPVEVTVEVSUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzN2AgPSAiUE9MSVRJQ0FMIE1JTElUSUEgVkVSU1VTIENJVklMSUFOUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAzOGAgPSAiUE9MSVRJQ0FMIE1JTElUSUEgVkVSU1VTIE9USEVSUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA0MGAgPSAiU09MRSBDT01NVU5BTCBNSUxJVElBIEFDVElPTiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA0NGAgPSAiQ09NTVVOQUwgTUlMSVRJQSBWRVJTVVMgQ09NTVVOQUwgTUlMSVRJQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA0NWAgPSAiQ09NTVVOQUwgTUlMSVRJQSBWRVJTVVMgUklPVEVSUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA0NmAgPSAiQ09NTVVOQUwJTUlMSVRJQQlWRVJTVVMgUFJPVEVTVEVSUyAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNDdgID0gIkNPTU1VTkFMIE1JTElUSUEgVkVSU1VTIENJVklMSUFOUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA0OGAgPSAiQ09NTVVOQUwgTUlMSVRJQSBWRVJTVVMgT1RIRVIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNTBgID0gIlNPTEUgUklPVEVSIEFDVElPTiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA1NWAgPSAiUklPVEVSUyBWRVJTVVMgUklPVEVSUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA1NmAgPSAiUklPVEVSUyBWRVJTVVMgUFJPVEVTVEVSUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA1N2AgPSAiUklPVEVSUyBWRVJTVVMgQ0lWSUxJQU5TIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDU4YCA9ICJSSU9URVJTIFZFUlNVUyBPVEhFUlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgNjBgID0gIlNPTEUgUFJPVEVTVEVSIEFDVElPTiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA2NmAgPSAiUFJPVEVTVEVSUyBWRVJTVVMgUFJPVEVTVEVSUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA2N2AgPSAiUFJPVEVTVEVSUyBWRVJTVVMgQ0lWSUxJQU5TIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDY4YCA9ICJQUk9URVNURVJTIFZFUlNVUyBPVEhFUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA3OGAgPSAiT1RIRVIgQUNUT1IgVkVSU1VTIENJVklMSUFOUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA4MGAgPSAiU09MRSBPVEhFUiBBQ1RJT04iKSwgDQogICAgICAgICBpbnRlcl90eXBlID0gdG9sb3dlcihzdHJfdHJpbShzdHJfcmVwbGFjZV9hbGwoaW50ZXJfdHlwZSwgIltcXHJcXG5cXHRdKyIsICIgIikpKSkgJT4lIA0KICBtdXRhdGUoYWRtaW4zX3Bjb2RlID0gaWZlbHNlKGFkbWluM19wY29kZSA9PSAiTU1SMDA3MDE0IiAmIGFkbWluMSA9PSAiWWFuZ29uIiwgIk1NUjAxMzAwNiIsIGFkbWluM19wY29kZSksDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBpZmVsc2UoYWRtaW4xID09ICJNYWd3YXkiICYgYWRtaW4zID09ICJNaW5obGEiLCAiTU1SMDA5MDEzIiwgYWRtaW4zX3Bjb2RlKSkgJT4lIA0KICBtdXRhdGUoaGFzX2ZhdGFsaXRpZXMgPSBpZmVsc2UoZmF0YWxpdGllcyA+IDAsIFRSVUUsIEZBTFNFKSkgJT4lDQogIG11dGF0ZShtb250aCA9IGx1YnJpZGF0ZTo6bW9udGgoZXZlbnRfZGF0ZSwgbGFiZWwgPSBUUlVFKSkgJT4lDQogIG11dGF0ZShub25fY29tYmF0YW50ID0gY2FzZV93aGVuKGV2ZW50X3R5cGUgPT0gIlZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIiB+IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGludGVyX3R5cGUsICJjaXZpbGlhbnxwcm90ZXN0ZXIiKSB+IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KG5vdGVzLCAiY2l2aWxpYW58cHJvdGVzdGVyfHZpbGxhZ2VyIikgfiBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IEZBTFNFKSkNCg0KIyBhY3Rvci1sZXZlbCBkYXRhc2V0DQphY3RvcnMgPC0gcmVhZF9jc3YoIjE5MDAtMDEtMDEtMjAyMi0wMi0wOS1NeWFubWFyLmNzdiIpICU+JSANCiAgbXV0YXRlKGFkbWluMyA9IHJlY29kZShhZG1pbjMsDQogICAgICAgICAgICAgICAgICAgICAgICAiRGFnb24gTXlvdGhpdC1Tb3V0aCIgPSAiRGFnb24gTXlvdGhpdCAoU291dGgpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJEYWdvbiBNeW90aGl0LU5vcnRoIiA9ICJEYWdvbiBNeW90aGl0IChOb3J0aCkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkRhZ29uIE15b3RoaXQtU2Vpa2thbiIgPSAiRGFnb24gTXlvdGhpdCAoU2Vpa2thbikiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkRhZ29uIE15b3RoaXQtRWFzdCIgPSAiRGFnb24gTXlvdGhpdCAoRWFzdCkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkhsYWluZ3RoYXJ5YS1FYXN0IiA9ICJIbGFpbmd0aGFyeWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkhsYWluZ3RoYXJ5YS1XZXN0IiA9ICJIbGFpbmd0aGFyeWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIlBhbmdzYW5nIiA9ICJQYW5nc2FuZyAoUGFuZ2hrYW0pIikpICU+JSANCiAgIyBsb2NhdGlvbnMgaW4geWFuZ29uIHdpdGggbG9uZ2xhdCwgYnV0IG5vIGFkbWluMyBoYXZlIGJlZW4gY29kZWQgYXMgS3lhdWt0YWRhLCB3aGVyZSBjaXR5IGhhbGwgaXM7DQogICMgc2ltaWxhcmx5LCBpbiBtYW5kYWxheSwgdGhleSBoYXZlIGJlZW4gcGxhY2VkIGluIENoYW5heWV0aGF6YW4gYW5kIFpheSB5YXIgdGhpIHJpIGluIE5QVA0KICBtdXRhdGUoYWRtaW4zID0gY2FzZV93aGVuKGlzLm5hKGFkbWluMykgJiBsYXRpdHVkZSA9PSAxNi44MDUyIH4gIkt5YXVrdGFkYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShhZG1pbjMpICYgbGF0aXR1ZGUgPT0gMTkuNzQ1MCB+ICJaYXkgWWFyIFRoaSBSaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5uYShhZG1pbjMpICYgbGF0aXR1ZGUgPT0gMjEuOTc0NyB+ICJDaGFuYXlldGhhemFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBhZG1pbjMpKSAlPiUgDQogIGxlZnRfam9pbih0b3duc2hpcHMgJT4lICANCiAgICAgICAgICAgICAgc2VsZWN0KHRvd25zaGlwX25hbWUsIGFkbWluM19wY29kZSksIGJ5ID0gYygiYWRtaW4zIiA9ICJ0b3duc2hpcF9uYW1lIikpICU+JSANCiAgbGVmdF9qb2luKGFjbGVkICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGludGVyYWN0aW9uLCBpbnRlcl90eXBlKSAlPiUgIGRpc3RpbmN0KCksIGJ5ID0gImludGVyYWN0aW9uIikgJT4lIA0KICBtdXRhdGUoYWN0b3Jfc2ltcGxlID0gYWN0b3IxKSAlPiUgDQogIG11dGF0ZShhY3Rvcl9zaW1wbGUgPSANCiAgICAgICAgICAgY2FzZV93aGVuKHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUGVvcGxlJ3MgRGVmZW5zZSBGb3JjZSIpIH4gIlBlb3BsZSdzIERlZmVuc2UgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJSb2hpbmd5YSBNdXNsaW0gR3JvdXAgXFwoTXlhbm1hclxcKSIpIH4gIlJvaGluZ3lhIE11c2xpbSBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJXb21lbiBcXChNeWFubWFyXFwpIikgfiAiV29tZW4gKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiMjEgR3VlcnJpbGxhIEZvcmNlIikgfiAiMjEgR3VlcnJpbGxhIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiMjcgUmV2b2x1dGlvbiBGb3JjZSIpIH4gIjI3IFJldm9sdXRpb24gRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICI4OCBHZW5lcmF0aW9uIFBlYWNlIGFuZCBPcGVuIFNvY2lldHkiKSB+ICI4OCBHZW5lcmF0aW9uIFBlYWNlIGFuZCBPcGVuIFNvY2lldHkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJBQkZTVSIpIH4gIkFCRlNVIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiQWlkIFdvcmtlcnMgXFwoTXlhbm1hclxcKSIpIH4gIkFpZCBXb3JrZXJzIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkF5YWRhdyBCb25lIE5haW5nIFBERiIpIH4gIkF5YWRhdyBCb25lIE5haW5nIFBERiIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkJhcHRpc3QgQ2hyaXN0aWFuIEdyb3VwIikgfiAiQmFwdGlzdCBDaHJpc3RpYW4gR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiQnVkZGhpc3QgR3JvdXAiKSB+ICJCdWRkaGlzdCBHcm91cCAoTXlhbm1hcikiLCANCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiQ0RGOiBDaGlubGFuZCBEZWZlbnNlIEZvcmNlIikgfiAiQ0RGOiBDaGlubGFuZCBEZWZlbnNlIEZvcmNlIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiQ2hpbiBFdGhuaWMgR3JvdXAiKSB+ICJDaGluIEV0aG5pYyBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJDaGluZXNlIEV0aG5pYyBHcm91cCIpIH4gIkNoaW5lc2UgRXRobmljIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkNocmlzdGlhbiBHcm91cCIpfiAiQ2hyaXN0aWFuIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkNpdmlsaWFucyBcXChNeWFubWFyXFwpIikgfiAiQ2l2aWxpYW5zIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkNOTy9DTkRGIikgfiAiQ05PL0NOREY6IENoaW4gTmF0aW9uYWwgT3JnYW5pemF0aW9uL0NoaW4gTmF0aW9uYWwgRGVmZW5zZSBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkRLQkEgXFwoQnVkZGhpc3RcXCkiKSB+ICJES0JBIChCdWRkaGlzdCk6IERlbW9jcmF0aWMgS2FyZW4gQnVkZGhpc3QgQXJteSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkZhcm1lcnMgXFwoTXlhbm1hclxcKSIpIH4gIkZhcm1lcnMgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiRGVtb2NyYXRpYyBHdWVycmlsbGEgRm9yY2UiKSB+ICJEZW1vY3JhdGljIEd1ZXJyaWxsYSBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkRHV0NGIikgfiAiREdXQ0Y6IERlbHRhIEd1ZXJyaWxsYSBXYXJmYXJlIENvbGxlY3RpdmUgRm9yY2VzIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiRm9ybWVyIEdvdmVybm1lbnQgb2YgTXlhbm1hciBcXCgyMDE2LVxcKSIpIH4gIkZvcm1lciBHb3Zlcm5tZW50IG9mIE15YW5tYXIgKDIwMTYtKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkZvcm1lciBHb3Zlcm5tZW50IG9mIE15YW5tYXIgXFwoMjAyMS1cXCkiKSB+ICJGb3JtZXIgR292ZXJubWVudCBvZiBNeWFubWFyICgyMDIxLSkiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJGb3JtZXIgTWlsaXRhcnkgRm9yY2VzIG9mIE15YW5tYXIgXFwoMjAxNi0yMDIxXFwpIikgfiANCiAgICAgICAgICAgICAgICAgICAgICAgIkZvcm1lciBNaWxpdGFyeSBGb3JjZXMgb2YgTXlhbm1hciAoMjAxNi0yMDIxKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkZvcm1lciBNaWxpdGFyeSBGb3JjZXMgb2YgTXlhbm1hciBcXCgyMDIxLVxcKSIpIH4gDQogICAgICAgICAgICAgICAgICAgICAgICJGb3JtZXIgTWlsaXRhcnkgRm9yY2VzIG9mIE15YW5tYXIgKDIwMjEtKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkdvdmVybm1lbnQgb2YgTXlhbm1hciBcXCgyMDExLTIwMTZcXCkiKSB+ICJHb3Zlcm5tZW50IG9mIE15YW5tYXIgKDIwMTEtMjAxNikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJHb3Zlcm5tZW50IG9mIE15YW5tYXIgXFwoMjAxNi1cXCkiKSB+ICJHb3Zlcm5tZW50IG9mIE15YW5tYXIgKDIwMTYtKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkdvdmVybm1lbnQgb2YgTXlhbm1hciBcXCgyMDIxLVxcKSIpIH4gIkdvdmVybm1lbnQgb2YgTXlhbm1hciAoMjAyMS0pIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiSGVhbHRoIFdvcmtlcnMgXFwoTXlhbm1hclxcKSIpIH4gIkhlYWx0aCBXb3JrZXJzIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkpvdXJuYWxpc3RzIFxcKE15YW5tYXJcXCkiKSB+ICJKb3VybmFsaXN0cyAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJLYWNoaW4gRXRobmljIEdyb3VwIFxcKE15YW5tYXJcXCkiKSB+ICJLYWNoaW4gRXRobmljIEdyb3VwIChNeWFubWFyKSIsIA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJLYXlhaCBFdGhuaWMgR3JvdXAgXFwoTXlhbm1hclxcKSIpfiAiS2F5YWggRXRobmljIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIktheWluIEV0aG5pYyBHcm91cCBcXChNeWFubWFyXFwpIil+ICJLYXlpbiBFdGhuaWMgR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiS2FyZW5uaSBEZW1vY3JhdGljIEZyb250IikgfiAiS0RGOiBLYXJlbm5pIERlbW9jcmF0aWMgRnJvbnQiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJLSU8vS0lBIikgfiAiS0lPL0tJQTogS2FjaGluIEluZGVwZW5kZW5jZSBPcmdhbml6YXRpb24vS2FjaGluIEluZGVwZW5kZW5jZSBBcm15IiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiS2FyZW5uaSBOYXRpb25hbGl0aWVzIERlZmVuc2UgRm9yY2UiKSB+ICJLTkRGOiBLYXJlbm5pIE5hdGlvbmFsaXRpZXMgRGVmZW5zZSBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkthcmVubmkgTmF0aW9uYWwgUHJvZ3Jlc3NpdmUgUGFydHkiKSB+ICJLTlBQL0tBOiBLYXJlbm5pIE5hdGlvbmFsIFByb2dyZXNzaXZlIFBhcnR5L0thcmVubmkgQXJteSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkthcmVuIE5hdGlvbmFsIFVuaW9uIikgfiAiS05VL0tOTEE6IEthcmVuIE5hdGlvbmFsIFVuaW9uL0thcmVuIE5hdGlvbmFsIExpYmVyYXRpb24gQXJteSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIktuaWdodHMgT2YgVGhlIFJlZCBMYW5kIikgfiAiS09STDogS25pZ2h0cyBPZiBUaGUgUmVkIExhbmQiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJLTlUvS05MQSBQZWFjZSBDb3VuY2lsIikgfiAiS1BDOiBLTlUvS05MQSBQZWFjZSBDb3VuY2lsIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTEdCVCBcXChNeWFubWFyXFwpIikgfiAiTEdCVCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJMYWJvdXIgR3JvdXAgXFwoTXlhbm1hclxcKSIpIH4gIkxhYm91ciBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJMaXN1IEV0aG5pYyBHcm91cCBcXChNeWFubWFyXFwpIikgfiAiTGlzdSBFdGhuaWMgR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTUc2IEd1ZXJyaWxsYSBGb3JjZSIpIH4gIk1HNiBHdWVycmlsbGEgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJNSEc6IE1vbnl3YSBIZXJvZXMgR3JvdXAiKSB+ICJNSEc6IE1vbnl3YSBIZXJvZXMgR3JvdXAiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJNSEg6IE11bmdzaGF3YSBIcHllbiBIcHVuZyIpIH4gIk1ISDogTXVuZ3NoYXdhIEhweWVuIEhwdW5nIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiQm9yZGVyIEd1YXJkIEZvcmNlIikgfiAiTWlsaXRhcnkgRm9yY2VzIG9mIE15YW5tYXIgLSBCb3JkZXIgR3VhcmQgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQb2xpY2UgRm9yY2VzIG9mIE15YW5tYXIiKSB+ICJQb2xpY2UgRm9yY2VzIG9mIE15YW5tYXIiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQZW9wbGUncyBNaWxpdGlhIEZvcmNlIikgfiAiUGVvcGxlJ3MgTWlsaXRpYSBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIk1pbGl0YXJ5IEZvcmNlcyBvZiBNeWFubWFyIikgfiAiTWlsaXRhcnkgRm9yY2VzIG9mIE15YW5tYXIiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJNTlRKUC9NTkRBQTogTXlhbm1hciBOYXRpb25hbCBUcnV0aCBhbmQgSnVzdGljZSBQYXJ0eS9NeWFubWFyIE5hdGlvbmFsIERlbW9jcmF0aWMgQWxsaWFuY2UgQXJteSIpIH4gDQogICAgICAgICAgICAgICAgICAgICAgICJNTlRKUC9NTkRBQTogTXlhbm1hciBOYXRpb25hbCBUcnV0aCBhbmQgSnVzdGljZSBQYXJ0eS9NeWFubWFyIE5hdGlvbmFsIERlbW9jcmF0aWMgQWxsaWFuY2UgQXJteSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIk1vbiBFdGhuaWMgR3JvdXAgXFwoTXlhbm1hclxcKSIpIH4gIk1vbiBFdGhuaWMgR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTW9ueXdhIE5pZ2h0a2luZyIpIH4gIk1vbnl3YSBOaWdodGtpbmciLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJNb255d2EgWW91bmcgUGVvcGxlIEdyb3VwIikgfiAiTW9ueXdhIFlvdW5nIFBlb3BsZSBHcm91cCIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIk1ybyBFdGhuaWMgR3JvdXAgXFwoTXlhbm1hclxcKSIpIH4gIk1ybyBFdGhuaWMgR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiTVRIU0Y6IE1vbiBUaGF0b24gU3BlY2lhbCBGb3JjZXMiKSB+ICJNVEhTRjogTW9uIFRoYXRvbiBTcGVjaWFsIEZvcmNlcyIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIk11c2xpbSBHcm91cCBcXChNeWFubWFyXFwpIikgfiAiTXVzbGltIEdyb3VwIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIk1XVkE6IE15YW5tYXIgV2FyIFZldGVyYW5zJyBBc3NvY2lhdGlvbiIpIH4gIk1XVkE6IE15YW5tYXIgV2FyIFZldGVyYW5zJyBBc3NvY2lhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIk5MRDogTmF0aW9uYWwgTGVhZ3VlIGZvciBEZW1vY3JhY3kiKSB+ICJOTEQ6IE5hdGlvbmFsIExlYWd1ZSBmb3IgRGVtb2NyYWN5IiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUGEtT2ggRXRobmljIEdyb3VwIFxcKE15YW5tYXJcXCkiKSB+ICJQYS1PaCBFdGhuaWMgR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUGFsYXVuZy9UYSdhbmcgRXRobmljIEdyb3VwIFxcKE15YW5tYXJcXCkiKSB+ICJQYWxhdW5nL1RhJ2FuZyBFdGhuaWMgR3JvdXAgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUGFsZSBKb2tlciBQREYiKSB+ICJQYWxlIEpva2VycyBQREYiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQZW9wbGUncyBEZWZlbnNlIEZyb2NlIikgfiAiUGVvcGxlJ3MgRGVmZW5zZSBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBlb3BsZSBEZWZlbnNlIEZyb2NlIikgfiAiUGVvcGxlJ3MgRGVmZW5zZSBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBlb3BsZSdzIEd1ZXJyaWxsYXMgQ29tbWFuZG8iKSB+ICJQZW9wbGUncyBHdWVycmlsbGFzIENvbW1hbmRvIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUGVvcGxlJ3MgTWlsaXRpYSBGb3JjZSIpIH4gIlBlb3BsZSdzIE1pbGl0aWEgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQaG9lbml4IERlZmVuc2UgRm9yY2UiKSB+ICJQaG9lbml4IERlZmVuc2UgRm9yY2UiLCANCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiUGhvZW5peCBTcGVjaWFsIEd1ZXJyaWxsYSBGb3JjZSIpIH4gIlBob2VuaXggU3BlY2lhbCBHdWVycmlsbGEgRm9yY2UiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJQTk8vUE5BOiBQYS1PaCBOYXRpb25hbCBPcmdhbml6YXRpb24vUGEtT2ggTmF0aW9uYWwgQXJteSIpIH4gDQogICAgICAgICAgICAgICAgICAgICAgICJQTk8vUE5BOiBQYS1PaCBOYXRpb25hbCBPcmdhbml6YXRpb24vUGEtT2ggTmF0aW9uYWwgQXJteSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlByaXNvbmVycyBcXChNeWFubWFyXFwpIikgfiAiUHJpc29uZXJzIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlBTTEYvVE5MQTogUGFsYXVuZyBTdGF0ZSBMaWJlcmF0aW9uIEZyb250L1RhJ2FuZyBOYXRpb25hbCBMaWJlcmF0aW9uIEFybXkiKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAiUFNMRi9UTkxBOiBQYWxhdW5nIFN0YXRlIExpYmVyYXRpb24gRnJvbnQvVGEnYW5nIE5hdGlvbmFsIExpYmVyYXRpb24gQXJteSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlJha2hpbmUgRXRobmljIEdyb3VwIFxcKE15YW5tYXJcXCkiKSB+ICJSYWtoaW5lIEV0aG5pYyBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJSQ1NTL1NTQS1TOiBSZXN0b3JhdGlvbiBDb3VuY2lsIG9mIFNoYW4gU3RhdGUvU2hhbiBTdGF0ZSBBcm15LVNvdXRoIikgfiANCiAgICAgICAgICAgICAgICAgICAgICAgIlJDU1MvU1NBLVM6IFJlc3RvcmF0aW9uIENvdW5jaWwgb2YgU2hhbiBTdGF0ZS9TaGFuIFN0YXRlIEFybXktU291dGgiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJSZWZ1Z2Vlcy9JRFBzIFxcKE15YW5tYXJcXCkiKSB+ICJSZWZ1Z2Vlcy9JRFBzIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlNoYW4gRXRobmljIEdyb3VwIFxcKE15YW5tYXJcXCkiKSB+ICJTaGFuIEV0aG5pYyBHcm91cCAoTXlhbm1hcikiLA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJTdHVkZW50cyBcXChNeWFubWFyXFwpIikgfiAiU3R1ZGVudHMgKE15YW5tYXIpIiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiVGVhY2hlcnMgXFwoTXlhbm1hclxcKSIpIH4gIlRlYWNoZXJzIChNeWFubWFyKSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlVMQS9BQTogVW5pdGVkIExlYWd1ZSBvZiBBcmFrYW4vQXJha2FuIEFybXkiKSB+ICJVTEEvQUE6IFVuaXRlZCBMZWFndWUgb2YgQXJha2FuL0FyYWthbiBBcm15IiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiVUxGQS1JOiBVbml0ZWQgTGliZXJhdGlvbiBGcm9udCBvZiBBc29tLUluZGVwZW5kZW50IikgfiANCiAgICAgICAgICAgICAgICAgICAgICAgIlVMRkEtSTogVW5pdGVkIExpYmVyYXRpb24gRnJvbnQgb2YgQXNvbS1JbmRlcGVuZGVudCIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIlVyYmFuIEd1ZXJyaWxsYSBHcm91cCIpIH4gIlVyYmFuIEd1ZXJyaWxsYSBHcm91cCIsIA0KICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChhY3Rvcl9zaW1wbGUsICJVU0RQOiBVbmlvbiBTb2xpZGFyaXR5IGFuZCBEZXZlbG9wbWVudCBQYXJ0eSIpIH4gIlVTRFA6IFVuaW9uIFNvbGlkYXJpdHkgYW5kIERldmVsb3BtZW50IFBhcnR5IiwNCiAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoYWN0b3Jfc2ltcGxlLCAiWmVybyBHdWVycmlsbGEgRm9yY2UiKSB+ICJaZXJvIEd1ZXJyaWxsYSBGb3JjZSIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkROUDogRGVtb2NyYXRpYyBQYXJ0eSBvZiBOYXRpb25hbCBQb2xpdGljcyIpIH4gIkROUDogRGVtb2NyYXRpYyBQYXJ0eSBvZiBOYXRpb25hbCBQb2xpdGljcyIsDQogICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGFjdG9yX3NpbXBsZSwgIkhsYXcgVGV0IEluIEFociBTdSAxMjY6IFJvd2luZyBGb3JjZSAxMjYiKSB+ICJIbGF3IFRldCBJbiBBaHIgU3UgMTI2OiBSb3dpbmcgRm9yY2UgMTI2IiwNCiAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBhY3Rvcl9zaW1wbGUpKSAlPiUgIA0KICBtdXRhdGUoaW50ZXIxID0gcmVjb2RlKGludGVyMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgYDFgID0gInN0YXRlX2ZvcmNlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgYDJgID0gInJlYmVsX2dyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgYDNgID0gInBvbGl0aWNhbF9taWxpdGlhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgYDRgID0gImlkZW50aXR5X21pbGl0aWFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBgNWAgPSAicmlvdGVycyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgYDZgID0gInByb3Rlc3RlcnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGA3YCA9ICJjaXZpbGlhbnMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBgOGAgPSAiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSkgJT4lICANCiAgbXV0YXRlKGludGVyMSA9IGZjdF9yZWxldmVsKGludGVyMSwgYygiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiLCAiaWRlbnRpdHlfbWlsaXRpYXMiLCAicmlvdGVycyIsICJyZWJlbF9ncm91cHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9saXRpY2FsX21pbGl0aWFzIiwgInN0YXRlX2ZvcmNlcyIsICJjaXZpbGlhbnMiLCAicHJvdGVzdGVycyIpKSkgJT4lIA0KICBtdXRhdGUoZXZlbnRfdHlwZSA9IGZjdF9yZWxldmVsKGV2ZW50X3R5cGUsIGMoIkJhdHRsZXMiLCAiRXhwbG9zaW9ucy9SZW1vdGUgdmlvbGVuY2UiLCAiVmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3Rlc3RzIiwgIlJpb3RzIiwgIlN0cmF0ZWdpYyBkZXZlbG9wbWVudHMiKSkpICU+JSANCiAgbXV0YXRlKGhhc19mYXRhbGl0aWVzID0gaWZlbHNlKGZhdGFsaXRpZXMgPiAwLCBUUlVFLCBGQUxTRSkpDQoNCiMgc2hhcGVmaWxlcw0KcGNvZGUzX3NoYXBlIDwtIHN0X3JlYWQoIi4vbW1yX3BvbGJuZGFfYWRtM19taW11XzI1MGsvbW1yX3BvbGJuZGFfYWRtM19taW11XzI1MGsuc2hwIiwgcXVpZXQgPSBUUlVFKSAlPiUgDQogcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSwNCiAgICAgICAgdG93bnNoaXAgPSBUUywNCiAgICAgICAgYWRtaW4zX3Bjb2RlID0gVFNfUENPREUpICU+JSANCiBtdXRhdGUoYWRtaW4zX3Bjb2RlID0gaWZlbHNlKHN0cl9kZXRlY3QodG93bnNoaXAsICJIbGFpbmd0aGFyeWEiKSwgIk1NUjAxMzAwOCIsIGFkbWluM19wY29kZSkpDQoNCnBjb2RlMV9zaGFwZSA8LSBzdF9yZWFkKCIuL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway9tbXJfcG9sYm5kYTJfYWRtMV9taW11XzI1MGsuc2hwIiwgcXVpZXQgPSBUUlVFKSAlPiUgDQogcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSkgJT4lIHN0X2FzX3NmKCkNCg0KIyByZWFkaW5nIGluIHRvd25zaGlwcyBmcm9tIGdlb2FkbWlucyANCnRvd25zaGlwcyA8LSByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwNCiAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgc2VsZWN0KGFkbWluMXBjb2RlXzQ6YWRtaW4zcGNvZGUpICU+JSANCiAgcmVuYW1lKGFkbWluMV9wY29kZSA9IGFkbWluMXBjb2RlXzQsDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBhZG1pbjNwY29kZSwNCiAgICAgICAgIHN0YXRlX25hbWUgICA9IHN0YXRlXzUsDQogICAgICAgICB0b3duc2hpcF9uYW1lICA9IGNvdW50eSkgJT4lIA0KICByZW1vdmVfZW1wdHkoKSAlPiUNCiAgbXV0YXRlKGFkbWluM19wY29kZSA9IGlmZWxzZShzdGF0ZV9uYW1lID09ICJNYWd3YXkiICYgdG93bnNoaXBfbmFtZSA9PSAiTWluaGxhIiwgIk1NUjAwOTAxMyIsIGFkbWluM19wY29kZSksDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBpZmVsc2Uoc3RhdGVfbmFtZSA9PSAiWWFuZ29uIiAmIHRvd25zaGlwX25hbWUgPT0gIkh0YW50YWJpbiIsICJNTVIwMTMwMDYiLCBhZG1pbjNfcGNvZGUpKQ0KDQojIHJlYWRpbmcgaW4gNVdzDQpmc2MgPC0gcmVhZF9jc3YoImZzYzV3XzIwMjEuY3N2IikNCg0KIyBhY2xlZF93b3JkcyBkZg0KYWNsZWRfd29yZHMgPC0gYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIHNlbGVjdChkYXRhX2lkLCBub3RlcykgJT4lIA0KICB1bm5lc3RfdG9rZW5zKHdvcmQsIG5vdGVzKSAlPiUgDQogIGFudGlfam9pbihzdG9wX3dvcmRzLCBieSA9ICJ3b3JkIikgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdCh3b3JkLCAiW2Etel0iKSkgJT4lIA0KICBsZWZ0X2pvaW4oYWNsZWQgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoZGF0YV9pZCwgYWRtaW4xLCBhZG1pbjNfcGNvZGUsIGV2ZW50X3R5cGUsIHN1Yl9ldmVudF90eXBlLCBmYXRhbGl0aWVzLCBpbnRlcl90eXBlKSwgYnkgPSAiZGF0YV9pZCIpDQoNCg0KIyByZWFkaW5nIGluIHZ1bG5lcmFiaWxpdHkgZGF0YXNldA0KdnVsbW1yIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL3NlYW55L0Rvd25sb2Fkcy9SL21tcl81d19pbml0aWFsX29ic2VydmF0aW9ucy9EYXRhc2V0c19WdWxuZXJhYmlsaXR5X0FuYWx5c2lzX2luX015YW5tYXJfMDlKdWwyMDE4ICgxKS54bHN4IiwNCiAgICAgICAgICAgc2tpcCA9IDEpICU+JSANCiAgc2xpY2UoLWMoMTozKSkgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgc2VsZWN0KC1sYWJlbCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhudW1iZXJfb2ZfdmlsbGFnZV90cmFjdHM6d2Jfd2VhbHRoX3JhbmspLCBhcy5udW1lcmljKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGRpc2FzdGVyc19pbXBhY3RlZF9ieV9uYXJnaXNfMjAwODphY2xlZF8yMDE1XzIwMTZfZGF0YV9leGlzdHMpLCBhcy5sb2dpY2FsKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGNvbmZsaWN0XzIwMTVfMjAxNl9udW1iZXJfb2ZfYmF0dGxlczpjb3JyZWN0ZWRfY29uZmxpY3RfaW5kZXhfZ2FycnkpLCBhcy5udW1lcmljKSAlPiUgDQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoIngiKSkgJT4lIA0KICBzZWxlY3QoLWMocHJpdmF0ZV9zZWN0b3JfZGV2ZWxvcG1lbnRfMjAxNF8yMDE1LCBwcm90ZWN0aW9uXzIwMTBfMjAxNSwgc2hlbHRlcl8yMDEwXzIwMTUsIHdhc2hfMjAxMF8yMDE1KSkNCg0KIyBzaG93X2NvbCh2aXJpZGlzX3BhbCgpKDEwKSkNCg0KYGBgDQoNCg0KIyMgMS4gUHJvZ3Jlc3NvaW4gb2YgY29uZmxpY3QgZXZlbnRzIGluIE15YW5tYXIgaW4gMjAyMSwgYnkgaW50ZXJhY3Rpb24gdHlwZQ0KDQpNeWFubWFyIGV4cGVyaWVuY2VkIDE2LDI2MyBzZXBhcmF0ZSBjb25mbGljdCBldmVudHMgaW4gMjAyMSwgd2hpY2ggbGVkIHRvIDExLDUwNiBmYXRhbGl0aWVzLiBDb25mbGljdCBmYXRhbGl0aWVzIGluIDIwMjEgd2VyZSBtb3JlIHRoYW4gZm9yIHRoZSBwcmV2aW91cyAxMCB5ZWFycyBjb21iaW5lZC4NCg0KTW9zdCBjb25mbGljdHMgaW4gTXlhbm1hciBhcmUgaW50ZXJhY3Rpb25zIGJldHdlZW4gdHdvIGdyb3VwcyBvZiBhY3RvcnMsIGFuZCBtb3N0IG9mIHRoZXNlIGludGVyYWN0aW9ucyBpbnZvbHZlIHRoZSBNeWFubWFyIE1pbGl0YXJ5IGFzIG9uZSBvZiB0aG9zZSBhY3RvcnMuDQoNClRoZSBtYXAgYmVsb3cgc2hvd3MgdGhlIHByb2dyZXNzIGluIG9mIHNpeCBtb3N0IGNvbW1vbiBjb25mbGljdCBpbnRlcmFjdGlvbiB0eXBlcyBieSAqKm1vbnRoKi4gT2YgdGhlc2UsIGZvdXIgaW52b2x2ZSB0aGUgTWlsaXRhcnkuDQoNClRoZSBtb3N0IGZhdGFsIGludGVyYWN0aW9ucyBpbiBNeWFubWFyIGluIDIwMjEgd2VyZSB0aG9zZSBiZXR3ZWVuIHRoZSBNaWxpdGFyeSBhbmQgcG9saXRpY2FsIG1pbGl0aWEgZ3JvdXBzLiBTdWNoIGludGVyYWN0aW9ucyBhY2NvdW50ZWQgZm9yIDU3JSBvZiB0aGUgMTEsNTA2IGNvbmZsaWN0IGZhdGFsaXRpZXMuIEluIGNvbXBhcmlzb24sIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBtaWxpdGFyeSBhbmQgcmViZWwgZ3JvdXBzIGFjY291bnRlZCBmb3IgMTkgcGVyY2VudCBvZiBmYXRhbGl0aWVzLCBtaWxpdGFyeSB2ZXJzdXMgY2l2aWxpYW4gaW50ZXJhY3Rpb25zIGZvciA5IHBlcmNlbnQsIGFuZCBwb2xpdGljYWwgbWlsaXRpYSB2ZXJzdXMgY2l2aWxpYW5zIGZvciA4IHBlcmNlbnQuDQoNClRoZSBtYXAgYmVsb3cgcGxvdHMgd2hlcmUgY29uZmxpY3QgZXZlbnRzIHRvb2sgcGxhY2UgYWNyb3NzIHRoZSBjb3VudHJ5LCBieSBpbnRlcmFjdGlvbiB0eXBlLCB3aXRoIHRoZSBzaXplIG9mIHRoZSBwb2ludHMgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgcGVyIGV2ZW50Lg0KDQoNCjxicj4NCiFbXShhY2xlZDQuZ2lmKQ0KDQoNCjxicj48YnI+PGJyPg0KDQoNCiMjIDIuIERpc3RyaWJ1dGlvbiBvZiBmb29kIHNlY3VyaXR5IHBhcnRuZXJzIGluIHJlbGF0aW9uIHRvIGNvbmZsaWN0IGV2ZW50cyANCg0KSW4gZ2VuZXJhbCwgZm9vZCBzZWN1cml0eSBwYXJ0bmVycyBhcmUgbm90IG9wZXJhdGluZyBpbiB0aGUgcGFydHMgb2YgTXlhbm1hciBtb3N0IGFmZmVjdGVkIGJ5IGNvbmZsaWN0IGluIDIwMjEuIFRoaXMgaXMgZXZpZGVudCBmcm9tIHRoZSBtYXAgYmVsb3cgd2hpY2ggcGxvdHMgRm9vZCBTZWN1cml0eSBQYXJ0bmVycyB3b3JraW5nIGFjcm9zcyBNeWFubWFyIGFnYWluc3QgMjAyMSBjb25mbGljdCBldmVudHMuDQoNClRoaXMgbGFjayBvZiBwYXJ0bmVycyBpbiBjb25mbGljdCBhcmVhcyBpcyBlc3BlY2lhbGx5IHRydWUgYXJvdW5kIFNhZ2FpbmcgYW5kIE1hZ3dheS4gU2FnYWluZyByZWdpb24gZXhwZXJpZW5jZWQgdGhlIG1vc3QgY29uZmxpY3QgaW4gMjAyMSwgZm9sbG93ZWQgYnkgTWFnd2F5IGFuZCBDaGluLg0KDQpIdW1hbml0YXJpYW4gcGFydG5lcnMgaGF2ZSB0cmFkaXRpb25hbGx5IGZvY3VzZWQgb24gUmFraGluZSwgS2FjaGluIGFuZCBub3J0aGVybiBTaGFuIOKAkyB0aGUgYXJlYXMgd2hpY2ggaGFkIGV4cGVyaWVuY2VkIG1vcmUgY29uZmxpY3QgaW4gdGhlIHBhc3QuIEhvd2V2ZXIsIGEgc2hpZnQgaW4gdGhlIGNvbmZsaWN0IGR5bmFtaWNzIGluIE15YW5tYXIgaGFzIG5vdCB5ZXQgbGVkIHRvIGEgcmVhbGxvY2F0aW9uIG9mIHJlc291cmNlcyB0byB0YXJnZXQgbmV3IHBvcHVsYXRpb25zIG1vc3QgYWZmZWN0ZWQgYnkgY29uZmxpY3QuIFRoZSBhbGxvY2F0aW9uIG9mIGZ1bmRzIGF3YXkgZnJvbSBTYWdhaW5nIGFuZCBNYWd3YXkgbWF5IGFsc28gYmUgYSByZXN1bHQgb2YgT0NIQeKAmXMgZGVjaXNpb24gdG8gZm9jdXMgb24gcGVyaS11cmJhbiBhcmVhcyB1bmRlciB0aGUgSW50ZXJpbSBFbWVyZ2VuY3kgUmVzcG9uc2UgUGxhbiBmb3IgTXlhbm1hciB3aGljaCB3YXMgcmVsZWFzZWQgaW4gSnVuZSBvZiAyMDIxLg0KDQpUaGUgZGlzdHJpYnV0aW9uIG9mIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBwYXJ0bmVycyBpbiBjb3JyZWxhdGlvbiB0byBjb25mbGljdCBhcmVhcyBpcyBkaXNjdXNzZWQgaW4gbW9yZSBkZXRhaWwgaW4gU2VjdGlvbiA2Lg0KIA0KDQo8YnI+DQoNCmBgYHtyIG1hcC1ldmVudHMtZnNjLXBhcm50ZXJzLCBmaWcuaGVpZ2h0PTEyfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUNCiAgZnVsbF9qb2luKGZzYyAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHRvd25zaGlwcyAlPiUgIA0KICAgICAgICAgICAgICBzZWxlY3QoYWRtaW4xX3Bjb2RlLCBhZG1pbjNfcGNvZGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBwYXJ0bmVycyksIHNpemUgPSAwLjEpICsgDQogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGUsIHkgPSBsYXRpdHVkZSksIHNpemUgPSAwLjUsIGFscGhhID0gMC40LCBjb2xvdXIgPSAicmVkIikgKw0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIGFscGhhID0gMCwgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xLCBicmVha3MgPSBjKDEsIDMsIDYsIDksIDEyKSkgKyANCiAgdGhlbWVfdm9pZCgpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgZm9vZCBzZWN1cml0eSBwYXJ0bmVycyBhbmQgY29uZmxpY3QgZXZlbnRzIGluIDIwMjEiLA0KICAgICAgIHN1YnRpdGxlID0gICJSZWQgZG90cyBhcmUgY29uZmxpY3QgZXZlbnRzOyBwZWFjZWZ1bCBwcm90ZXN0cyBoYXZlIGJlZW4gZXhjbHVkZWQiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2VzOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSBhbmQgRm9vZCBTZWN1cml0eSBDbHVzdGVyIE15YW5tYXIiLA0KICAgICAgIGZpbGwgPSAibnVtYmVyIG9mXG5wYXJ0bmVycyIpICsgDQogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCiMgZ2dzYXZlKGZpbGVuYW1lID0gIi4vcGFydG5lcnNfY29uZmxpY3RfbWFwLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gMTIsIHdpZHRoID0gNywgdW5pdHMgPSAiaW4iKQ0KYGBgDQogDQogPGJyPjxicj48YnI+DQoNCg0KIyMgMy4gUHJvZ3Jlc3Npb24gYW5kIGRpc3RyaWJ1dGlvbiBvZiBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMNCg0KIyMjIDMuMSBDb25mbGljdCBpbiBNeWFubWFyIG92ZXIgdGltZQ0KDQpNeWFubWFyIGV4cGVyaWVuY2VkIGEgbWFzc2l2ZSBzcGlrZSBpbiBjb25mbGljdCBldmVudHMgaW4gMjAyMS4gIFRoaXMgc3VkZGVuIGluY3JlYXNlIGNhbWUgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IE15YW5tYXIgaGFzIGJlZW4gZW1icm9pbGVkIGluIGEgNzAteWVhci1sb25nIGNpdmlsIHdhci4gDQoNCkluIDIwMjEsIHRoZXJlIHdlcmUgMTYsMjYzIGNvbmZsaWN0IGV2ZW50cyBpbiBNeWFubWFyLCB3aGlsZSBpbiAyMDIwIHRoZXJlIHdlcmUganVzdCAxLDQ4MC4gSW4gdGhlIHByZWNlZGluZyBkZWNhZGUsIDIwMTkgaGFkIGFjY291bnRlZCBmb3IgdGhlIG1vc3QgY29uZmxpY3QgZXZlbnRzLCBob3dldmVyIHRoZXJlIHdlcmUgb25seSAxLDgxMSBpbiB0aGF0IHllYXIuIEluIGp1c3QgdHdvIHllYXJzLCBjb25mbGljdCBpbiBNeWFubWFyIGluY3JlYXNlZCBhbG1vc3QgdGVuZm9sZC4NCg0KPGJyPg0KDQpgYGB7ciBiYXJwbG90LXllYXItZXZlbnRzfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGV2ZW50X3R5cGUpICYgeWVhciA8IDIwMjIpICU+JQ0KICBtdXRhdGUoeWVhciA9IHJvdW5kKHllYXIpKSAlPiUgDQogIGdyb3VwX2J5KHllYXIsIGV2ZW50X3R5cGUpICU+JQ0KICBzdW1tYXJpc2UoY291bnQgPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHllYXIsIGNvdW50LCBmaWxsID0gZXZlbnRfdHlwZSwgZ3JvdXAgPSBldmVudF90eXBlKSkgKyANCiAgIyBnZW9tX2xpbmUoc2l6ZSA9IDEpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoc3RhdCh5KSwgYWNjdXJhY3kgPSAxKSwgZ3JvdXAgPSB5ZWFyKSwgc3RhdCA9ICJzdW1tYXJ5IiwgZnVuID0gc3VtLCB2anVzdCA9IC0wLjcsIHNpemUgPSAzKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAxMCwgMjAyMSwgYnkgPSAxKSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCBsaW1pdHMgPSBjKDAsIDE3MDAwKSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksIA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGV2ZW50cyIsDQogICAgICAgdGl0bGUgPSAiQ29uZmxpY3QgZXZlbnRzIGJ5IGV2ZW50IHR5cGUsIDIwMTAtMjAyMSIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KDQpgYGANCg0KPGJyPg0KDQoNClRoZSBicmVha2Rvd24gb2YgY29uZmxpY3QgZXZlbnRzIGluIDIwMjEgd2FzOg0KDQpgYGB7ciBjb25mbGljdC1ldmVudHMtc3VtbWFyeS0yMDIxfQ0KYWNsZWQgJT4lICANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShldmVudF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShDb3VudCA9IG4oKSkgJT4lIA0KICBtdXRhdGUoUGVyY2VudGFnZSA9IHJvdW5kKENvdW50IC8gc3VtKENvdW50KSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcmVuYW1lKGBFdmVudCB0eXBlYCA9IGV2ZW50X3R5cGUpICU+JSANCiAgYXJyYW5nZShkZXNjKFBlcmNlbnRhZ2UpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiMjAyMSBldmVudCB0eXBlcyBieSBwZXJjZW50YWdlIG9mIHRvdGFsIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUgIA0KICBmb290bm90ZShnZW5lcmFsID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjIgQ29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIGluIDIwMjENCg0KTXlhbm1hciBleHBlcmllbmNlZCAgbW9yZSBjb25mbGljdCBmYXRhbGl0aWVzIGluIDIwMjEgdGhhbiBpbiB0aGUgcHJlY2VkaW5nIGRlY2FkZS4gSW4gMjAyMSB0aGVyZSB3ZXJlIDExLDUwNiBjb25mbGljdC1yZWxhdGVkIGRlYXRocy4gQmV0d2VlbiAyMDEwIGFuZCAyMDIwIHRoZSBjb21iaW5lZCBudW1iZXIgb2YgZGVhdGhzIHdhcyA5LDQwNC4NCg0KVmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMgYWNjb3VudGVkIGZvciAxLDg5MSBkZWF0aHMuIFRoaXMgd2FzIG1vcmUgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYWNyb3NzIGFsbCBjb25mbGljdCBldmVudHMgaW4gMjAxOS4gVW50aWwgbGFzdCB5ZWFyLCAyMDE5IGhhZCBiZWVuIHRoZSBkZWFkbGllc3QgY29uZmxpY3QgeWVhciBpbiBNeWFubWFyIGluIHRoZSBwYXN0IGRlY2FkZS4NCg0KSG93ZXZlciwgYW55IHJlYWN0aW9uIHRvIHRoaXMgc2lnbmlmaWNhbnQgaW5jcmVhc2UgYXBwZWFycyBsaW1pdGVkLiBZZXQsIGlmIGEgc2luZ2xlIGV2ZW50IHN1Y2ggYXMgYSBjeWNsb25lIGhhZCBpbmNyZWFzZWQgYW5udWFsIGZhdGFsaXRpZXMgYnkgbW9yZSB0aGFuIDEwMDAlLCBvbmUgbWlnaHQgZXhwZWN0IGFuIHVyZ2VudCByZXNwb25zZSBhbmQgYSBkcmFzdGljIHJlYWxsb2NhdGlvbiBvZiByZXNvdXJjZXMuDQoNCg0KPGJyPg0KDQpgYGB7ciBiYXJwbG90LXllYXItZmF0YWx0aWVzfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGV2ZW50X3R5cGUpICYgeWVhciA8IDIwMjIpICU+JQ0KICBtdXRhdGUoeWVhciA9IHJvdW5kKHllYXIpKSAlPiUgDQogIGdyb3VwX2J5KHllYXIsIGV2ZW50X3R5cGUpICU+JQ0KICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIGdncGxvdChhZXMoeWVhciwgZmF0YWxpdGllcywgZmlsbCA9IGV2ZW50X3R5cGUsIGdyb3VwID0gZXZlbnRfdHlwZSkpICsgDQogICMgZ2VvbV9saW5lKHNpemUgPSAxKSArIA0KICBnZW9tX2NvbCgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHN0YXQoeSksIGFjY3VyYWN5ID0gMSksIGdyb3VwID0geWVhciksIHN0YXQgPSAic3VtbWFyeSIsIGZ1biA9IHN1bSwgdmp1c3QgPSAtMC43LCBzaXplID0gMykgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMTAsIDIwMjEsIGJ5ID0gMSkpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgbGltaXRzID0gYygwLCAxMjUwMCkpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDkpLCANCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpLA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIk51bWJlciBvZiBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMiLA0KICAgICAgIHRpdGxlID0gIkZhdGFsaXRpZXMgYnkgY29uZmxpY3QgZXZlbnQgdHlwZSwgMjAxMC0yMDIxIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpDQoNCg0KYGBgDQoNCg0KPGJyPjxicj4NCg0KIyMjIDMuMyBQcm9ncmVzc2lvbiBvZiBjb25mbGljdCBldmVudHMgaW4gMjAyMQ0KDQpUaGUgTWlsaXRhcnkgdGFrZW92ZXIgb24gMSBGZWJydWFyeSBsZWQgdG8gYSBzdGVhZHkgcmlzZSBpbiBiYXR0bGVzLCBleHBsb3Npb25zIGFuZCByZW1vdGUgdmlvbGVuY2UsIGFuZCBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzLCB0aHJvdWdoIHRvIE1heSAyMDIxLiANCg0KVGhlIGluY2lkZW5jZSBvZiB0aGVzZSBldmVudHMgZGVjbGluZWQgYnJpZWZseSBiZXR3ZWVuIEp1bmUgYW5kIEF1Z3VzdCwgYmVmb3JlIHJpc2luZyBhZ2FpbiBpbiBTZXB0ZW1iZXIgMjAyMS4NCg0KUHJvdGVzdHMgYW5kIHJpb3RzIHBlYWtlZCBpbiBNYXJjaCAyMDIxLCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGFrZW92ZXIuIEV2ZW50cyBpbnZvbHZpbmcgdmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMgZ3JldyBpbiBmcmVxdWVuY3kgdGhyb3VnaG91dCB0aGUgeWVhciwgdGhvdWdoIGEgc2xpZ2h0IGRlY2xpbmUgaW4gaW50ZW5zaXR5IHdhcyBub3RlZCBhdCB0aGUgZW5kIG9mIHRoZSAyMDIxLg0KIA0KDQo8YnI+DQoNCmBgYHtyIGZhY2V0LWxpbmUtcGxvdC1tb250aGx5fQ0KYWNsZWQgJT4lICANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShtb250aCwgZXZlbnRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JQ0KICMgIG11dGF0ZShtb250aCA9IGZjdF9yZXYobW9udGgpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1vbnRoLCB5ID0gY291bnQsIGdyb3VwID0gZXZlbnRfdHlwZSwgY29sb3VyID0gZXZlbnRfdHlwZSkpICsgDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICBmYWNldF93cmFwKH5ldmVudF90eXBlLCBzY2FsZXMgPSAiZnJlZV95IikgKyANCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgZXZlbnRzIiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIDIwMjEgY29uZmxpY3QgZXZlbnRzIHBlciBtb250aCwgYnkgdHlwZSIsDQogICAgICAgc3VidGl0bGUgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkNCg0KIyBjdW11bGF0aXZlIGNvdW50cyByZXN1bHRzIGluIGEgbGVzcyBpbnRlcmVzdGluZyBncmFwaCANCiMgYWNsZWQgJT4lICANCiMgICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQojICAgbXV0YXRlKG1vbnRoID0gbHVicmlkYXRlOjptb250aChldmVudF9kYXRlLCBsYWJlbCA9IFRSVUUpKSAlPiUNCiMgICBncm91cF9ieShtb250aCwgZXZlbnRfdHlwZSkgJT4lIA0KIyAgIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIA0KIyAgIHVuZ3JvdXAoKSAlPiUgDQojICAgZ3JvdXBfYnkoZXZlbnRfdHlwZSkgJT4lIA0KIyAgIG11dGF0ZShjdW1fY291bnQgPSBjdW1zdW0oY291bnQpKSAlPiUgDQojICAgZ2dwbG90KGFlcyh4ID0gbW9udGgsIHkgPSBjdW1fY291bnQsIGdyb3VwID0gZXZlbnRfdHlwZSwgY29sb3VyID0gZXZlbnRfdHlwZSkpICsgDQojICAgZ2VvbV9zbW9vdGgoc2UgPSBGQUxTRSkgKw0KIyAgIGZhY2V0X3dyYXAofmV2ZW50X3R5cGUsIHNjYWxlcyA9ICJmcmVlX3kiKSArIA0KIyAgIGxhYnMoeCA9ICIiLA0KIyAgICAgICAgeSA9ICJOdW1iZXIgb2YgZXZlbnRzIiwgDQojICAgICAgICB0aXRsZSA9ICJQcm9ncmVzc2lvbiBvZiAyMDIxIGNvbmZsaWN0IGV2ZW50cywgYnkgdHlwZSIsDQojICAgICAgICBzdWJ0aXRsZSA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpICsgDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KYGBgDQoNCjxicj4NCg0KSXQgaXMgbm90IGNsZWFyIHdoYXQgY2F1c2VkIGEgZHJvcCBpbiB0aGUgbnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyBpbiBKdW5lLCBKdWx5IGFuZCBBdWd1c3QsIHRob3VnaCBvbmUgaHlwb3RoZXNpcyBpcyB0aGF0IGhlYXZ5IGZpZ2h0aW5nIGluIE1heSBsZWQgdG8gYSBsdWxsIGluIGFjdGl2aXR5IGFzIGFjdG9ycyBzcGVudCB0aW1lIHJlZ3JvdXBpbmcgYW5kIHJldGhpbmtpbmcgdGhlaXIgc3RyYXRlZ2llcy4gQSBwb3NzaWJsZSBleGFtcGxlIG9mIHRoaXMgaXMgdGhlIGZvcm1hdGlvbiBvZiAgdGhlIFBlb3BsZeKAmXMgRGVmZW5jZSBGb3JjZSBpbiBNYXkgMjAyMS4gDQoNCkEgc3Bpa2UgaW4gYXJyZXN0cyBkdXJpbmcgTWF5IG1pZ2h0IGhhdmUgYWxzbyBjb250cmlidXRlZCwgd2l0aCBtYXNzIGFycmVzdHMgZGltaW5pc2hpbmcgdGhlIGNhcGFjaXR5IG9mIGNlcnRhaW4gYWN0b3JzIHRvIGVuZ2FnZSBpbiBjb25mbGljdC4gVGhlIGRpcCBpbiBjb25mbGljdCBhbHNvIGNvaW5jaWRlcyB3aXRoIHRoZSBwYWRkeSBzb3dpbmcgcGVyaW9kLiANCg0KVGhlIHRhYmxlIGJlbG93IHByb3ZpZGVzIGEgbW9yZSBkZXRhaWxlZCBzbmFwc2hvdCBvZiBjb25mbGljdHMsIGJyb2tlbiBkb3duIGJ5IHN1Yi1ldmVudHMuIE1vc3QgdmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMgd2FzIHRocm91Z2ggdGhlIHN1Yi1ldmVudCB0eXBlIGxhYmVsbGVkICpBdHRhY2sqLiANCiANCg0KPGJyPg0KDQpgYGB7ciBsaW5lLXBsb3Qtc3ViLWV2ZW50LXR5cGUtMjAyMSwgZmlnLmhlaWdodD01fQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGZpbHRlcihzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JSANCiAgbXV0YXRlKHN1Yl9ldmVudF90eXBlID0gZmN0X2x1bXAoc3ViX2V2ZW50X3R5cGUsIDgpKSAlPiUgDQogIGdyb3VwX2J5KG1vbnRoLCBzdWJfZXZlbnRfdHlwZSkgJT4lDQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtb250aCwgeSA9IGNvdW50LCBjb2xvdXIgPSBzdWJfZXZlbnRfdHlwZSwgZ3JvdXAgPSBzdWJfZXZlbnRfdHlwZSkpICsNCiAgZ2VvbV9saW5lKHNpemUgPSAwLjcpICsgDQogIHNjYWxlX2NvbG91cl92aXJpZGlzX2QoZGlyZWN0aW9uID0gLTEsIG9wdGlvbiA9ICJ0dXJibyIpICsgDQogIGxhYnMoeCA9ICJNb250aCIsIA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyIsIA0KICAgICAgIHRpdGxlID0gIjIwMjEgY29uZmxpY3QgZXZlbnRzIGJ5IHN1Yi1ldmVudCB0eXBlIChwZWFjZWZ1bCBwcm90ZXN0cyBleGNsdWRlZCkiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsDQogICAgICAgY29sb3VyID0gIiIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpDQpgYGANCg0KDQo8YnI+PGJyPg0KDQojIyMgMy40IENvbnRyaWJ1dG9ycyB0byBjb25mbGljdCBmYXRhbGl0aWVzDQoNCkJhdHRsZXMgYW5kIGV4cGxvc2lvbnMgYW5kIHJlbW90ZSB2aW9sZW5jZSB3ZXJlIHRoZSBsYXJnZXN0IGNvbnRyaWJ1dG9ycyB0byBjb25mbGljdCBmYXRhbGl0aWVzIGluIDIwMjEuIA0KDQo8YnI+DQoNCmBgYHtyIGxpbmUtcGxvdC1mYXRhbGl0aWVzLCBmaWcuaGVpZ2h0PTZ9DQogDQphY2xlZCAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBtdXRhdGUobW9udGggPSBmbG9vcl9kYXRlKGV2ZW50X2RhdGUsICJtb250aCIpKSAlPiUgDQogIG11dGF0ZShtb250aCA9IG1hcChtb250aCwgfiBzZXEuRGF0ZShhcy5EYXRlKC4pLCBhcy5EYXRlKCIyMDIxLzEyLzAxIiksIGJ5ID0gIm1vbnRoIikpKSAlPiUgDQogIHVubmVzdChtb250aCkgJT4lIA0KICBtdXRhdGUobW9udGggPSBsdWJyaWRhdGU6Om1vbnRoKG1vbnRoLCBsYWJlbCA9IFRSVUUpKSAlPiUgDQogICMgbXV0YXRlKG1vbnRoID0gZm9ybWF0X0lTTzg2MDEobW9udGgsIHByZWNpc2lvbiA9ICJ5bSIpKSAlPiUNCiAgZ3JvdXBfYnkobW9udGgsIGV2ZW50X3R5cGUpICU+JQ0KICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIGdncGxvdChhZXMoeCA9IG1vbnRoLCB5ID0gZmF0YWxpdGllcywgZ3JvdXAgPSBldmVudF90eXBlLCBmaWxsID0gZXZlbnRfdHlwZSkpICsgDQogIGdlb21fYXJlYSgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMjAwMCwgYnkgPSAxMDAwKSwgbGFiZWxzID0gY29tbWEpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICJDdW11bGF0aXZlIGZhdGFsaXRpZXMiLCANCiAgICAgICB0aXRsZSA9ICJDdW11bGF0aXZlIDIwMjEgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIHBlciBtb250aCwgYnkgZXZlbnQgdHlwZSIsDQogICAgICAgc3VidGl0bGUgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLCANCiAgICAgICBmaWxsID0gIiIpDQoNCg0KYGBgDQoNCjxicj4NCg0KT2YgY29uY2VybiwgdmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMgYWNjb3VudGVkIGZvciAxNSUgb2YgYWxsIGNvbmZsaWN0IGZhdGFsaXRpZXMuDQoNCmBgYHtyIGZhdGFsaXRpZXMtc3VtbWFyeS0yMDIxfQ0KYWNsZWQgJT4lICANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShldmVudF90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIG11dGF0ZShwZXJjZW50YWdlID0gcm91bmQoZmF0YWxpdGllcyAvIHN1bShmYXRhbGl0aWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcmVuYW1lKGBFdmVudCB0eXBlYCA9IGV2ZW50X3R5cGUsDQogICAgICAgICBGYXRhbGl0aWVzID0gZmF0YWxpdGllcywgDQogICAgICAgICBQZXJjZW50YWdlID0gcGVyY2VudGFnZSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoUGVyY2VudGFnZSkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICIyMDIxIGNvbmZsaWN0IGZhdGFsaXRpZXMgYnkgZXZlbnQgdHlwZSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikgJT4lICANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIGdlbmVyYWxfdGl0bGUgPSAiIikNCmBgYA0KDQo8YnI+DQoNCkhvd2V2ZXIsIHRoZSBldmVudCB0eXBlICpWaW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyogZG9lcyBub3QgZW5jb21wYXNzIGFsbCBmYXRhbCBpbmNpZGVudHMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzLiBJZiB0aGUgZGF0YSBpcyBleGFtaW5lZCB0aHJvdWdoIHRoZSBsZW5zIG9mIGludGVyYWN0aW9uIHR5cGUsIHdoaWNoIHJlY29yZHMgdGhlIHR5cGVzIG9mIGFjdG9ycyBpbnZvbHZlZCBpbiBlYWNoIGNvbmZsaWN0IGV2ZW50LCBpdCBzaG93cyB0aGF0IGByIHJvdW5kKChmaWx0ZXIoYWNsZWQsIHllYXIgPT0gMjAyMSAmIHN0cl9kZXRlY3QoaW50ZXJfdHlwZSwgImNpdmlsaWFufHByb3Rlc3RlciIpKSAlPiUge3N1bSguJGZhdGFsaXRpZXMpfSkgLyAoZmlsdGVyKGFjbGVkLCB5ZWFyID09IDIwMjEpICU+JSB7c3VtKC4kZmF0YWxpdGllcyl9KSAqIDEwMCwgZGlnaXRzID0gMilgIHBlcmNlbnQgb2YgZmF0YWxpdGllcyBzdGVtIGZyb20gaW50ZXJhY3Rpb25zIGludm9sdmluZyBub24tY29tYmF0YW50cywgdGhhdCBpcyBjaXZpbGlhbnMgYW5kIHByb3Rlc3RlcnMuIFRoZSBuZXh0IGNoYXB0ZXIgZGVhbHMgd2l0aCBhIG1vcmUgZGV0YWlsZWQgYXNzZXNzbWVudCBvZiB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgcmVsYXRlZCB0byBub24tY29tYmF0YW50cy4NCg0KPGJyPg0KDQpgYGB7ciBsaW5lLXBsb3QtaW50ZXItdHlwZS0yMDIxLCBmaWcuaGVpZ2h0PTZ9DQoNCmFjbGVkICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIG11dGF0ZShtb250aCA9IGZsb29yX2RhdGUoZXZlbnRfZGF0ZSwgIm1vbnRoIikpICU+JSANCiAgbXV0YXRlKG1vbnRoID0gbWFwKG1vbnRoLCB+IHNlcS5EYXRlKGFzLkRhdGUoLiksIGFzLkRhdGUoIjIwMjEvMTIvMDEiKSwgYnkgPSAibW9udGgiKSkpICU+JSANCiAgdW5uZXN0KG1vbnRoKSAlPiUgDQogIG11dGF0ZShtb250aCA9IGx1YnJpZGF0ZTo6bW9udGgobW9udGgsIGxhYmVsID0gVFJVRSkpICU+JSANCiAgZmlsdGVyKGludGVyX3R5cGUgIT0gInNvbGUgcHJvdGVzdGVyIGFjdGlvbiIpICU+JSANCiAgbXV0YXRlKGludGVyX3R5cGUgPSBmY3RfbHVtcChpbnRlcl90eXBlLCA2KSkgJT4lIA0KICBncm91cF9ieShtb250aCwgaW50ZXJfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtb250aCwgeSA9IGZhdGFsaXRpZXMsIGdyb3VwID0gaW50ZXJfdHlwZSwgZmlsbCA9IGludGVyX3R5cGUpKSArIA0KICBnZW9tX2FyZWEoKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTIwMDAsIGJ5ID0gMTAwMCksIGxhYmVscyA9IGNvbW1hKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNEOTVGMDIiLCAiIzc1NzBCMyIsICIjMUI5RTc3IiwgIiNFNzI5OEEiLCAiIzY2QTYxRSIsICIjRTZBQjAyIiwgIiM2NjY2NjYiLCAiI0E2NzYxRCIpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArDQogIGxhYnMoeCA9ICJNb250aCIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBmYXRhbGl0aWVzIiwgDQogICAgICAgdGl0bGUgPSAiQ3VtdWxhdGl2ZSBmYXRhbGl0aWVzIGluIDIwMjEgYnkgaW50ZXJhY3Rpb24gdHlwZSwgZXhjbHVkaW5nIHNvbGUgcHJvdGVzdGVyIGFjdGlvbiIsDQogICAgICAgc3VidGl0bGUgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLCANCiAgICAgICBmaWxsID0gIiIpICAgDQoNCmBgYA0KDQo8YnI+DQoNClRoZSBsYXJnZXN0IG51bWJlciBvZiBmYXRhbGl0aWVzIGFyZSByZWxhdGVkIHRvIGV2ZW50cyBpbnZvbHZpbmcgdGhlIG1pbGl0YXJ5LCBwb2xpdGljYWwgbWlsaXRpYXMsIGluY2x1ZGluZyB0aGUgUGVvcGxl4oCZcyBEZWZlbnNlIEZvcmNlLCBhcyB3ZWxsIGFzIHRob3NlIGludm9sdmluZyByZWJlbCBncm91cHMuIA0KDQpgYGB7ciBmYXRhbGl0aWVzLXN1bW1hcnktMjAyMS1pbnRlci10eXBlfQ0KYWNsZWQgJT4lICANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lDQogIGZpbHRlcihpbnRlcl90eXBlICE9ICJzb2xlIHByb3Rlc3RlciBhY3Rpb24iKSAlPiUgDQogIG11dGF0ZShpbnRlcl90eXBlID0gZmN0X2x1bXAoaW50ZXJfdHlwZSwgNiksIA0KICAgICAgICAgaW50ZXJfdHlwZSA9IHN0cl90b190aXRsZShpbnRlcl90eXBlKSwgDQogICAgICAgICBpbnRlcl90eXBlID0gc3RyX3JlcGxhY2VfYWxsKGludGVyX3R5cGUsICJWZXJzdXMiLCAidmVyc3VzIikpICU+JSANCiAgZ3JvdXBfYnkoaW50ZXJfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBtdXRhdGUocGVyY2VudGFnZSA9IHJvdW5kKGZhdGFsaXRpZXMgLyBzdW0oZmF0YWxpdGllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIHJlbmFtZShGYXRhbGl0aWVzID0gZmF0YWxpdGllcywgDQogICAgICAgICBQZXJjZW50YWdlID0gcGVyY2VudGFnZSwNCiAgICAgICAgIGBJbnRlcmFjdGlvbiB0eXBlYCA9IGludGVyX3R5cGUpICU+JSANCiAgYXJyYW5nZShkZXNjKFBlcmNlbnRhZ2UpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiMjAyMSBjb25mbGljdCBmYXRhbGl0aWVzIGJ5IGludGVyYWN0aW9uIHR5cGUiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSwgcG9zaXRpb24gPSAibGVmdCIpICU+JSAgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLCBnZW5lcmFsX3RpdGxlID0gIiIpDQoNCg0KYGBgDQoNCg0KPGJyPjxicj4NCg0KIyMjIDMuNSBHZW9ncmFwaGljIGRpc3RyaWJ1dGlvbiBvZiBjb25mbGljdCBldmVudHMgaW4gMjAyMQ0KDQo8YnI+IA0KDQpgYGB7ciBzdGF0ZS1ldmVudHMtcGxvdH0NCg0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluMSwgZXZlbnRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSANCiAgbXV0YXRlKHN1bSA9IHN1bShjb3VudCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKGFkbWluMSA9IGZjdF9yZW9yZGVyKGFkbWluMSwgc3VtLCAuZGVzYyA9IFRSVUUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGFkbWluMSwgeSA9IGNvdW50LCBmaWxsID0gZXZlbnRfdHlwZSkpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoc3RhdCh5KSwgYWNjdXJhY3kgPSAxKSwgZ3JvdXAgPSBhZG1pbjEpLCBzdGF0ID0gInN1bW1hcnkiLCBmdW4gPSBzdW0sIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCBicmVha3MgPSBzZXEoMCwgMzgwMCwgYnkgPSAxMDAwKSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgaGp1c3QgPSAxLCBhbmdsZSA9IDYwKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2YgY29uZmxpY3QgZXZlbnRzIiwNCiAgICAgICB0aXRsZSA9ICIyMDIxIGNvbmZsaWN0IGV2ZW50cyBieSBzdGF0ZS9yZWdpb24iLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIikNCg0KICANCmBgYA0KDQo8YnI+DQoNClNhZ2FpbmcgZXhwZXJpZW5jZWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBpbiAyMDIxLiBJbmRlZWQsIFNhZ2FpbmcgcmVnaW9uIGV4cGVyaWVuY2VkIG1vcmUgdGhhbiB0aHJlZSB0aW1lcyB0aGUgbnVtYmVyIG9mIGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyB0aGFuIE1hZ3dheSwgdGhlIG5leHQgbW9zdC1hZmZlY3RlZCBhcmVhLiBUaGlzIHJlcHJlc2VudHMgYSBzaWduaWZpY2FudCBzaGlmdCBpbiB0aGUgcGF0dGVybiBvZiBjb25mbGljdCBpbiBNeWFubWFyLCB3aGljaCBoYXMgdHJhZGl0aW9uYWxseSByZXZvbHZlZCBhcm91bmQgS2FjaGluLCBSYWtoaW5lIGFuZCBTaGFuLg0KDQo8YnI+DQoNCmBgYHtyIHN0YXRlLWZhdGFsaXRpZXMtcGxvdH0NCg0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluMSwgZXZlbnRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBtdXRhdGUoc3VtID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShhZG1pbjEgPSBmY3RfcmVvcmRlcihhZG1pbjEsIHN1bSwgLmRlc2MgPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBhZG1pbjEsIHkgPSBmYXRhbGl0aWVzLCBmaWxsID0gZXZlbnRfdHlwZSkpICsgDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoc3RhdCh5KSwgYWNjdXJhY3kgPSAxKSwgZ3JvdXAgPSBhZG1pbjEpLCBzdGF0ID0gInN1bW1hcnkiLCBmdW4gPSBzdW0sIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hLCBicmVha3MgPSBzZXEoMCwgNTAwMCwgYnkgPSAxMDAwKSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgaGp1c3QgPSAxLCBhbmdsZSA9IDYwKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJOdW1iZXIgb2YgZmF0YWxpdGllcyIsDQogICAgICAgdGl0bGUgPSAiMjAyMSBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMgYnkgc3RhdGUvcmVnaW9uIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpDQogDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDMuNiBQcm9ncmVzc2lvbiBvZiB0aGUgY29uZmxpY3QgaW4gMjAyMSBieSBldmVudCB0eXBlDQoNClRoZSBtYXAgYmVsb3cgc2hvd3MgMjAyMSBjb25mbGljdCBldmVudHMgYnkgKiptb250aCoqLiBUaGUgY29sb3Igb2YgZWFjaCBwb2ludCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgY29uZmxpY3QgZXZlbnQuIFRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBldmVudCBpcyBpbmRpY2F0ZWQgYnkgdGhlIHNpemUgb2YgZWFjaCBwb2ludC4gSXQgaXMgaW50ZXJlc3RpbmcgdG8gbm90ZSB0aGF0IGFmdGVyIHRoZSBwcm90ZXN0cyBpbiBGZWJydWFyeSBhbmQgTWFyY2ggMjAyMSwgdGhlIGNvbmZsaWN0IG1vdmVzIG9uIHRvIGEgbmV3IHN0YWdlIGluIEFwcmlsIGFuZCBNYXksIHZpc2libHkgaW5jcmVhc2luZyBpbiBpbnRlbnNpdHkuDQoNCjxicj4NCiFbXShldmVudF90eXBlLmdpZikNCg0KPGJyPjxicj48YnI+DQoNCiMjIDQuIENvbmZsaWN0IGFuZCBub24tY29tYmF0YW50cyANCg0KIyMjIDQuMSBDb25mbGljdCBldmVudHMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzDQoNCjxicj4NCg0KTm9uLWNvbWJhdGFudHMgd2VyZSBpbnZvbHZlZCBpbiBhbG1vc3Qgb25lIHRoaXJkIG9mIGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyBpbiBNeWFubWFyIGluIDIwMjEuIEluIHRvdGFsLCB0aGVyZSB3ZXJlIGByIGZpbHRlcihhY2xlZCwgeWVhciA9PSAyMDIxKSAlPiUge3N1bSguJGZhdGFsaXRpZXMpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgZmF0YWxpdGllcywgb2Ygd2hpY2ggYHIgcm91bmQoZmlsdGVyKGFjbGVkLCB5ZWFyID09IDIwMjEgJiBub25fY29tYmF0YW50ID09IFRSVUUpICU+JSB7c3VtKC4kZmF0YWxpdGllcyl9KSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSByZWxhdGVkIHRvIG5vbi1jb21iYXRhbnRzLiANCg0KVGhlIG1hcCBiZWxvdyBzaG93cyBjb25mbGljdCBldmVudHMgbGFiZWxsZWQgYnkgQUNMRUQgYXMgKlZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zKiBhbmQgd2hlcmUgdGhlIGV2ZW50IHdhcyBkZXNjcmliZWQgYXMgaW52b2x2aW5nIGEgY2l2aWxpYW4sIHByb3Rlc3Rlciwgb3IgdmlsbGFnZXIuDQoNCkhvd2V2ZXIsIHByb3Rlc3QgZXZlbnRzIGhhdmUgYmVlbiBmaWx0ZXJlZCBvdXQgYXMgdGhlc2UgYXJlIGdlbmVyYWxseSBvbmUtc2lkZWQsIHdoZXJlIHRoZSBvbmx5IGFjdG9ycyBpbnZvbHZlZCBhcmUgcHJvdGVzdGVycyBhbmQgdGhleSBkbyBub3QgcmVzdWx0IGluIHByb3BlcnR5IGRhbWFnZSBvciBkZWF0aC4gDQoNCkV2ZW50cyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMgYXJlIHBsb3R0ZWQgb24gdGhlIG1hcCBiZWxvdywgd2l0aCB0aG9zZSBldmVudHMgdGhhdCByZXN1bHRlZCBpbiBmYXRhbGl0aWVzIHNob3duIGluIHJlZC4NCiANCjxicj4NCg0KYGBge3IgbWFwLW5vbi1jb21iYXRhbnRzLCBmaWcuaGVpZ2h0PTEwfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUgDQogIGZpbHRlcihub25fY29tYmF0YW50ID09IFRSVUUpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShoYXNfZmF0YWxpdGllcykpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihzaXplID0gMC4xLCBhbHBoYSA9IDAsIGRhdGEgPSBwY29kZTNfc2hhcGUpICsgDQogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGUsIHkgPSBsYXRpdHVkZSwgc2l6ZSA9IGZhdGFsaXRpZXMsIGNvbG91ciA9IGhhc19mYXRhbGl0aWVzKSwgYWxwaGEgPSAwLjYpICsNCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBhbHBoYSA9IDAsIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJibHVlIiwgInJlZCIpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMC41LCA0KSkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiAyMDIxIGNvbmZsaWN0IGV2ZW50cyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMiLA0KICAgICAgIHN1YnRpdGxlID0gICJDaXZpbGlhbnMgYW5kIHByb3Rlc3RlcnMgYXJlIGNvbnNpZGVyZWQgbm9uLWNvbWJhdGFudHMiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2VzOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIGFuZCBGb29kIFNlY3VyaXR5IENsdXN0ZXIgTXlhbm1hciIsDQogICAgICAgZmlsbCA9ICJudW1iZXIgb2ZcbnBhcnRuZXJzIikgKyANCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhPTEpKSkNCmBgYA0KDQo8YnI+DQoNCkEgYnJlYWtkb3duIG9mIHN1YiBjb25mbGljdCBldmVudHMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzIGlzIGxpc3RlZCBiZWxvdy4gDQoNCg0KYGBge3IgdGFibGUtc3ViLWV2ZW50LW5vbi1jb21iYXRhbnRzfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUgDQogIGZpbHRlcihub25fY29tYmF0YW50ID09IFRSVUUpICU+JSANCiAgZ3JvdXBfYnkoc3ViX2V2ZW50X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGV2ZW50cyA9IG4oKSwgDQogICAgICAgICAgICBmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIG11dGF0ZShzb3J0ID0gZXZlbnRzIC8gc3VtKGV2ZW50cykgKyBmYXRhbGl0aWVzIC8gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIG11dGF0ZShzdWJfZXZlbnRfdHlwZSA9IGlmZWxzZShzb3J0IDwgMC4wMTcsICJPdGhlciIsIHN1Yl9ldmVudF90eXBlKSkgJT4lIA0KICBncm91cF9ieShzdWJfZXZlbnRfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoZXZlbnRzID0gc3VtKGV2ZW50cyksIA0KICAgICAgICAgICAgZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICByZW5hbWUoYFN1Yi1ldmVudCB0eXBlYCA9IHN1Yl9ldmVudF90eXBlLCANCiAgICAgICAgIEV2ZW50cyA9IGV2ZW50cywgDQogICAgICAgICBGYXRhbGl0aWVzID0gZmF0YWxpdGllcykgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRvcCAxMCBzdWItZXZlbnQgdHlwZXMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzIGluIDIwMjEiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIHBvc2l0aW9uID0gImxlZnQiLCBmdWxsX3dpZHRoID0gRkFMU0UpICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDQuMiBFdmVudHMgYW5kIGZhdGFsaXRpZXMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzLCBieSBzdGF0ZQ0KDQpNb3N0IG9mIHRoZSBmYXRhbCBjb25mbGljdCBldmVudHMgaW4gTXlhbm1hciBpbiAyMDIxIG9jY3VycmVkIGluIFNhZ2FpbmcgcmVnaW9uLiBJbiB0b3RhbCwgdGhlIHJlZ2lvbiByZWNvcmRlZCAxLDE3OCBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMsIHNpZ25pZmljYW50bHkgbW9yZSB0aGFuIGluIE1hbmRhbGF5IGFuZCBZYW5nb24sIHRoZSBuZXh0IG1vc3QgZmF0YWwgcmVnaW9ucy4gSW4gTWFuZGFsYXksIHRoZXJlIHdlcmUgNDExIGNvbmZsaWN0LXJlbGF0ZWQgZGVhdGhzIGFuZCBpbiBZYW5nb24gdGhlcmUgd2VyZSAzMDAuDQoNCmBgYHtyIGJhcnBsb3QtZXZlbnRzLWZhdGFsaXRpZXMtc3J9DQphY2xlZCAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEgJiBzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JSANCiAgZmlsdGVyKG5vbl9jb21iYXRhbnQgPT0gVFJVRSkgJT4lDQogIGdyb3VwX2J5KGFkbWluMSkgJT4lIA0KICBzdW1tYXJpc2UoZXZlbnRzID0gbigpLCANCiAgICAgICAgICAgIGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpICU+JQ0KICBtdXRhdGUoYWRtaW4xID0gZmN0X3Jlb3JkZXIoYWRtaW4xLCAtZmF0YWxpdGllcykpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGZhdGFsaXRpZXMsIGV2ZW50cyksIG5hbWVzX3RvID0gInR5cGUiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUgDQogIG11dGF0ZSh0eXBlID0gZmN0X3JlbGV2ZWwodHlwZSwgYygiZmF0YWxpdGllcyIsICJldmVudHMiKSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYWRtaW4xLCB5ID0gdmFsdWUsIGZpbGwgPSB0eXBlKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSB2YWx1ZSksIHNpemUgPSAyLjUsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCB2anVzdCA9IC0wLjMpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0MCwgdmp1c3QgPSAwLjYpLCANCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIk51bWJlciBvZiBmYXRhbGl0aWVzIC8gZXZlbnRzIiwNCiAgICAgICB0aXRsZSA9ICIyMDIxIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMgYnkgc3RhdGUgKGV4Y2wuIHBlYWNlZnVsIHByb3Rlc3RzKSIsDQogICAgICAgc3VidGl0bGUgPSAiRGF0YSBzb3VyY2VzOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwgDQogICAgICAgZmlsbCA9ICIiKQ0KDQpgYGANCjxicj4NCg0KVGhlIGNoYXJ0IGFib3ZlIHNob3dzIGV2ZW50cyBhbmQgZmF0YWxpdGllcyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMsIGJyb2tlbiBkb3duIGJ5IHN0YXRlIGFuZCByZWdpb24uIA0KDQpUaGUgbGFyZ2UgbnVtYmVyIG9mIGZhdGFsaXRpZXMgaW4gU2FnYWluZywgTWFuZGFsYXkgYW5kIFlhbmdvbiBhcmUgZHVlIHRvIGEgaGlnaCByYXRlIG9mIGFycmVzdHMgYW5kIGF0dGFja3Mgb24gY2l2aWxpYW5zLCBhcyBzaG93biBiZWxvdy4gSG93ZXZlciwgdGhlIHJhdGlvIG9mIGF0dGFja3MgdG8gYXJyZXN0cyBpcyBzaWduaWZpY2FudGx5IGhpZ2hlciBpbiBTYWdhaW5nIHRoYW4gY29tcGFyZWQgdG8gTWFuZGFsYXkgYW5kIFlhbmdvbi4NCg0KDQpgYGB7ciB0YWJsZS1zdWItZXZlbnRzLXNyfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUgDQogIGZpbHRlcihub25fY29tYmF0YW50ID09IFRSVUUpICU+JQ0KICBtdXRhdGUoc3ViX2V2ZW50X3R5cGUgPSBmY3RfbHVtcChzdWJfZXZlbnRfdHlwZSwgNSkpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4xLCBzdWJfZXZlbnRfdHlwZSkgJT4lDQogIHN1bW1hcmlzZShldmVudHMgPSBuKCksDQogICAgICAgICAgICBGYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzdWJfZXZlbnRfdHlwZSwgdmFsdWVzX2Zyb20gPSBldmVudHMpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4xKSAlPiUgDQogIHN1bW1hcmlzZShhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYyksIH4gc3VtKC54LCBuYS5ybSA9IFRSVUUpKSkgJT4lDQogIG11dGF0ZShhZG1pbjEgPSByZWNvZGUoYWRtaW4xLCAiTmF5IFB5aSBUYXciID0gIk5heXB5aXRhdyIpKSAlPiUNCiAgcmVuYW1lKHN0YXRlID0gYWRtaW4xKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhGYXRhbGl0aWVzKSkgJT4lIA0KICByZWxvY2F0ZShGYXRhbGl0aWVzLCAuYWZ0ZXIgPSBPdGhlcikgJT4lDQogIHJlbmFtZShTdGF0ZSA9IHN0YXRlKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiTWFpbiBzdWItZXZlbnQgdHlwZXMgYW5kIGZhdGFsaXRpZXMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzIGJ5IHN0YXRlL3JlZ2lvbiIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJEYXRhIHNvdXJjZXM6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLCANCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KICANCiAgDQpgYGANCg0KDQo8YnI+DQoNCkthbGUgVG93bnNoaXAgaW4gU2FnYWluZyBleHBlcmllbmNlZCB0aGUgaGlnaGVzdCByYXRlIG9mIGZhdGFsaXRpZXMgaW52b2x2aW5nIG5vbi1jb21iYXRhbnRzIGluIDIwMjEuIEluIHRvdGFsLCA3IHBlciBjZW50IG9mIG5vbi1jb21iYXRhbnQtcmVsYXRlZCBmYXRhbGl0aWVzIG9jY3VyZWQgaW4gS2FsZSwgd2hpY2ggcmVwcmVzZW50cyBgciBmaWx0ZXIoYWNsZWQsIHllYXIgPT0gMjAyMSAmIGFkbWluM19wY29kZSA9PSAiTU1SMDA1MDI3IiAmIG5vbl9jb21iYXRhbnQgPT0gVFJVRSkgJT4lIHtzdW0oLiRmYXRhbGl0aWVzKX1gIGRlYXRocy4gT3ZlcmFsbCwgYHIgZmlsdGVyKGFjbGVkLCB5ZWFyID09IDIwMjEgJiBmYXRhbGl0aWVzID4gMCAmIG5vbl9jb21iYXRhbnQgPT0gVFJVRSkgJT4lIGRpc3RpbmN0KGFkbWluM19wY29kZSkgJT4lIG5yb3coKWAgIHRvd25zaGlwcyByZXBvcnRlZCBmYXRhbGl0aWVzIGludm9sdmluZyBub24tY29tYmF0YW50cyBpbiAyMDIxLiBPZiB0aGUgMjAgdG93bnNoaXBzIHdpdGggdGhlIG1vc3Qgbm9uLWNvbWJhdGFudCBmYXRhbGl0aWVzLCAxMSB3ZXJlIGluIHRoZSBTYWdhaW5nIFJlZ2lvbi4gDQoNCjxicj4NCg0KYGBge3IgbWFwLXRvd25zaGlwcy1mYXRhbGl0aWVzLW5vbmNvbWJhdGFudCwgZmlnLmhlaWdodD0xMH0NCmFjbGVkICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBmaWx0ZXIobm9uX2NvbWJhdGFudCA9PSBUUlVFKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluMSwgYWRtaW4zLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKGV2ZW50cyA9IG4oKSwgDQogICAgICAgICAgICBmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShwY19ldmVudHMgPSBldmVudHMgLyBzdW0oZXZlbnRzKSwgDQogICAgICAgICBwY19mYXRhbGl0aWVzID0gZmF0YWxpdGllcyAvIHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocGNfZmF0YWxpdGllcykpICU+JSANCiAgbXV0YXRlKHBjX2ZhdGFsaXRpZXMgPSBuYV9pZihwY19mYXRhbGl0aWVzLCAwKSwgDQogICAgICAgICBmYXRhbGl0aWVzID0gbmFfaWYoZmF0YWxpdGllcywgMCkpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGZhdGFsaXRpZXMpLCBzaXplID0gMC4xKSArIA0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIGFscGhhID0gMCwgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1hZ21hIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnModGl0bGUgPSAiRmF0YWxpdGllcyBpbnZvbHZpbmcgbm9uLWNvbWJhdGFudHMgYnkgdG93bnNoaXAgMjAyMSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsDQogICAgICAgZmlsbCA9ICJmYXRhbGl0aWVzIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC4yKSkNCg0KDQogIA0KYGBgDQoNCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNS4gQ29uZmxpY3QgYWN0b3JzDQoNCiMjIyA1LjEgQ29uZmxpY3QgZXZlbnRzIGJ5IHR5cGUgb2YgYWN0b3IgDQoNClRoZSBuZXh0IHR3byBzZWN0aW9ucyBzdW1tYXJpemUgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIGJ5IGV2ZW50IHR5cGUgYW5kIGFjdG9yIHR5cGUuIA0KDQpJbiB0aGUgcGxvdCBiZWxvdywgZmFjZXRlZCBieSB0eXBlIG9mIGNvbmZsaWN0IGFjdG9yLCBzaG93cyB0aGUgdHlwZXMgb2YgY29uZmxpY3QgZXZlbnRzIGVhY2ggdHlwZSBvZiBhY3RvciBoYXMgYmVlbiBpbnZvbHZlZCBpbiBkdXJpbmcgMjAyMS4gRm9yIGluc3RhbmNlLCBwb2xpdGljYWwgbWlsaXRpYXMgYXJlIG1vc3QgaGVhdmlseSBpbnZvbHZlZCBpbiBjb25mbGljdCBldmVudHMgcmVsYXRlZCB0byBleHBsb3Npb25zIGFuZCByZW1vdGUgdmlvbGVuY2UsIHdoZXJlYXMgcmViZWwgZ3JvdXBzIGFyZSBtb3N0IGludm9sdmVkIGluIGJhdHRsZXMuIA0KDQpCZWNhdXNlIG1vc3QgZXZlbnQgdHlwZXMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBwZWFjZWZ1bCBwcm90ZXN0cywgaW52b2x2ZSBtb3JlIHRoYW4gb25lIGFjdG9yLCBpbmRpdmlkdWFsIGV2ZW50cyBhcHBlYXIgaW4gbW9yZSB0aGFuIG9uZSB0YWJsZS4gRm9yIGV4YW1wbGUsIHRoZSBzYW1lIGJhdHRsZSBpbnZvbHZpbmcgc3RhdGUgZm9yY2VzIGFuZCByZWJlbCBncm91cHMgd291bGQgYXBwZWFyIGluIHRoZSBldmVudCBjb3VudCB0YWJsZXMgZm9yIGVhY2ggdHlwZSBvZiBjb25mbGljdCBhY3Rvci4gVGhpcyBtZWFucyBhY3R1YWwgbnVtYmVyIG9mIGV2ZW50cyBpcyBsZXNzIHRoYW4gdGhlIHRvdGFsIHNob3duIGFjcm9zcyBhbGwgdGFibGVzLg0KIA0KDQo8YnI+DQoNCmBgYHtyIGFjdG9yLWZhY2V0LWV2ZW50LWNvdW50LCBmaWcuaGVpZ2h0ID0gN30NCg0KYWN0b3JzICU+JQ0KICBtdXRhdGUoZXZlbnRfdHlwZSA9IGZjdF9yZWxldmVsKGV2ZW50X3R5cGUsIGMoIkJhdHRsZXMiLCAiRXhwbG9zaW9ucy9SZW1vdGUgdmlvbGVuY2UiLCAiVmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3Rlc3RzIiwgIlJpb3RzIiwgIlN0cmF0ZWdpYyBkZXZlbG9wbWVudHMiKSkpICU+JSANCiAgbXV0YXRlKGludGVyMSA9IGZjdF9yZWxldmVsKGludGVyMSwgYygic3RhdGVfZm9yY2VzIiwgInByb3Rlc3RlcnMiLCAiY2l2aWxpYW5zIiwgInBvbGl0aWNhbF9taWxpdGlhcyIsICJyZWJlbF9ncm91cHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaW90ZXJzIiwgImlkZW50aXR5X21pbGl0aWFzIiwgImV4dGVybmFsX290aGVyX2ZvcmNlIikpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoYWN0b3Jfc2ltcGxlLCBldmVudF90eXBlLCBpbnRlcjEpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLA0KICAgICAgICAgICAgZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBncm91cF9ieShldmVudF90eXBlKSAlPiUgDQogICMgZmlsdGVyKGludGVyMSAhPSAiaWRlbnRpdHlfbWlsaXRpYXMiKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGNvdW50LCB5ID0gZXZlbnRfdHlwZSwgZmlsbCA9IGV2ZW50X3R5cGUpKSArDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgIyBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsNCiAgZmFjZXRfd3JhcCh+IGludGVyMSwgc2NhbGVzID0gImZyZWVfeCIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyBhc3NvY2lhdGVkIHdpdGggZWFjaCBhY3RvciB0eXBlIiwgDQogICAgICAgeSA9ICJUeXBlIG9mIGNvbmZsaWN0IGV2ZW50IiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyBhc3NvY2lhdGVkIHdpdGggZWFjaCBhY3RvciB0eXBlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IHR5cGUgb2YgY29uZmxpY3QgYWN0b3IiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCmBgYHtyIHN1bW1hcnktdGFibGUtZXZlbnRfdHlwZX0NCmFjdG9ycyAlPiUgDQogIG11dGF0ZShpbnRlcjEgPSBmY3RfcmVsZXZlbChpbnRlcjEsIGMoInN0YXRlX2ZvcmNlcyIsICJwcm90ZXN0ZXJzIiwgImNpdmlsaWFucyIsICJwb2xpdGljYWxfbWlsaXRpYXMiLCAicmViZWxfZ3JvdXBzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmlvdGVycyIsICJpZGVudGl0eV9taWxpdGlhcyIsICJleHRlcm5hbF9vdGhlcl9mb3JjZSIpKSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGBBY3RvciB0eXBlYCA9IGludGVyMSkgJT4lIA0KICBzdW1tYXJpc2UoZXZlbnRzID0gbigpKSAlPiUgIA0KICBtdXRhdGUoYEFjdG9yIHR5cGVgID0gc3RyX3RvX3RpdGxlKGBBY3RvciB0eXBlYCkpICU+JSANCiAgdHJhbnNwb3NlX2RmKCkgJT4lIA0KICByb3dfdG9fbmFtZXMocm93X251bWJlciA9IDEpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoIlByb3Rlc3RlcnMiLCAiQ2l2aWxpYW5zIiwgIlN0YXRlX2ZvcmNlcyIsICJQb2xpdGljYWxfbWlsaXRpYXMiLCAiUmViZWxfZ3JvdXBzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmlvdGVycyIsICJJZGVudGl0eV9taWxpdGlhcyIsICJFeHRlcm5hbF9vdGhlcl9mb3JjZSIpLA0KICAgICAgICAgICAgfiBhcy5udW1lcmljKC54KSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIjIwMjEgbnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyBieSBhY3RvciB0eXBlIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSwgZGlnaXRzID0gMCkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDUuMiBGYXRhbGl0aWVzIGJ5IGFjdG9yIHR5cGUNCg0KVGhlIHRhYmxlcyBiZWxvdyBzaG93IHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyBhc3NvY2lhdGVkIHdpdGggZWFjaCB0eXBlIG9mIGFjdG9yLiANCg0KU2ltaWxhciB0byB0aGUgcGxvdCBhYm92ZSwgdGhlIHBsb3QgYmVsb3cgaGFzIGJlZW4gZmFjZXRlZCBieSBhY3RvciB0eXBlIGFuZCBzaG93cyB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgYWN0b3IgdHlwZSBieSB0eXBlIG9mIGV2ZW50LiBBcyB0aGVzZSBhY3RvciB0eXBlcyBhcmUgZXhoYXVzdGl2ZSwgYSBzcGVjaWZpYyBldmVudCB0eXBlIGNhbiBiZSB0cmFja2VkIGFjcm9zcyBkaWZmZXJlbnQgYWN0b3JzLiBGb3IgaW5zdGFuY2UsIHRoZXJlIHdlcmUgMSw3MjkgZmF0YWxpdGllcyByZWxhdGVkIHRvICpWaW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucyogKGluIGdyZWVuKSwgdXNpbmcgdGhlIHBsb3QgYmVsb3csIG9uZSBjYW4gc2VlIGhvdyBtYW55IG9mIHRoZXNlIDEsNzI5IGZhdGFsaXRpZXMgdGhlIHZhcmlvdXMgYWN0b3IgdHlwZXMgd2VyZSBhc3NvY2lhdGVkIHdpdGguIENpdmlsaWFucyB3ZXJlLCBvZiBjb3Vyc2UsIG9uZSBvZiB0aGUgcGFydGllcyBpbnZvbHZlZCBpbiB0aGUgKlZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zKiBldmVudCB0eXBlLCBidXQgdGhlIG90aGVyIGxhcmdlc3QgYWN0b3JzIHdlcmUgc3RhdGUgZm9yY2VzIGFuZCBwb2xpdGljYWwgbWlsaXRpYXMuICANCg0KSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIEFDTEVEIGRhdGFzZXQgZG9lcyBub3QgaGF2ZSBhIGNvbHVtbiB0byBhc3NpZ24gYmxhbWUuIEZvciBpbnN0YW5jZSwgdW5kZXIgZmF0YWxpdGllcyByZWxhdGVkIHRvIHByb3Rlc3RzLCBgciBmaWx0ZXIoYWN0b3JzLCBpbnRlcjEgPT0gInByb3Rlc3RlcnMiKSAlPiUge3N1bSguJGZhdGFsaXRpZXMpfWAgZmF0YWxpdGllcyB3ZXJlIGFzc29jaWF0ZWQgd2l0aCBwcm90ZXN0ZXJzLCB3aXRoIHRoZSBtYWluIG90aGVyIHBhcnR5IGludm9sdmVkIGFsbW9zdCBlbnRpcmVseSBiZWluZyBzdGF0ZSBmb3JjZXMsIHdpdGggdmVyeSBzbWFsbCBudW1iZXJzIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCByaW90ZXJzLg0KDQo8YnI+DQoNCmBgYHtyIGFjdG9yLWZhY2V0LWV2ZW50LWZhdGFsaXRpZXMsIGZpZy5oZWlnaHQ9N30NCg0KYWN0b3JzICU+JQ0KICBtdXRhdGUoZXZlbnRfdHlwZSA9IGZjdF9yZWxldmVsKGV2ZW50X3R5cGUsIGMoIkJhdHRsZXMiLCAiRXhwbG9zaW9ucy9SZW1vdGUgdmlvbGVuY2UiLCAiVmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3Rlc3RzIiwgIlJpb3RzIiwgIlN0cmF0ZWdpYyBkZXZlbG9wbWVudHMiKSkpICU+JSANCiAgbXV0YXRlKGludGVyMSA9IGZjdF9yZWxldmVsKGludGVyMSwgYygic3RhdGVfZm9yY2VzIiwgInByb3Rlc3RlcnMiLCAiY2l2aWxpYW5zIiwgInBvbGl0aWNhbF9taWxpdGlhcyIsICJyZWJlbF9ncm91cHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaW90ZXJzIiwgImlkZW50aXR5X21pbGl0aWFzIiwgImV4dGVybmFsX290aGVyX2ZvcmNlIikpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoYWN0b3Jfc2ltcGxlLCBldmVudF90eXBlLCBpbnRlcjEpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLA0KICAgICAgICAgICAgZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICBncm91cF9ieShldmVudF90eXBlKSAlPiUgDQogIGZpbHRlcihpbnRlcjEgJW91dCUgYygiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSkgJT4lIA0KICBtdXRhdGUocGNfdG90YWwgPSBjb3VudCAvIHN1bShjb3VudCkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZmF0YWxpdGllcywgeSA9IGV2ZW50X3R5cGUsIGZpbGwgPSBldmVudF90eXBlKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogICMgc2NhbGVfZmlsbF92aXJpZGlzX2QoKSArDQogIGZhY2V0X3dyYXAofiBpbnRlcjEsIHNjYWxlcyA9ICJmcmVlX3giKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBmYXRhbGl0aWVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGFjdG9yIHR5cGUiLCANCiAgICAgICB5ID0gIlR5cGUgb2YgY29uZmxpY3QgZXZlbnQiLCANCiAgICAgICB0aXRsZSA9ICJOdW1iZXIgb2YgZmF0YWxpdGllcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBhY3RvciB0eXBlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGYWNldGVkIGJ5IHR5cGUgb2YgY29uZmxpY3QgYWN0b3IiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KDQpgYGANCjxicj4NCg0KYGBge3Igc3VtbWFyeS10YWJsZS1mYXRhbGl0aWVzfQ0KYWN0b3JzICU+JSANCiAgbXV0YXRlKGludGVyMSA9IGZjdF9yZWxldmVsKGludGVyMSwgYygic3RhdGVfZm9yY2VzIiwgInByb3Rlc3RlcnMiLCAiY2l2aWxpYW5zIiwgInBvbGl0aWNhbF9taWxpdGlhcyIsICJyZWJlbF9ncm91cHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaW90ZXJzIiwgImlkZW50aXR5X21pbGl0aWFzIiwgImV4dGVybmFsX290aGVyX2ZvcmNlIikpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoYEFjdG9yIHR5cGVgID0gaW50ZXIxKSAlPiUgDQogIHN1bW1hcmlzZShGYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgIA0KICBtdXRhdGUoYEFjdG9yIHR5cGVgID0gc3RyX3RvX3RpdGxlKGBBY3RvciB0eXBlYCkpICU+JSANCiAgdHJhbnNwb3NlX2RmKCkgJT4lIA0KICByb3dfdG9fbmFtZXMocm93X251bWJlciA9IDEpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoIlByb3Rlc3RlcnMiLCAiQ2l2aWxpYW5zIiwgIlN0YXRlX2ZvcmNlcyIsICJQb2xpdGljYWxfbWlsaXRpYXMiLCAiUmViZWxfZ3JvdXBzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmlvdGVycyIsICJJZGVudGl0eV9taWxpdGlhcyIsICJFeHRlcm5hbF9vdGhlcl9mb3JjZSIpLA0KICAgICAgICAgICAgfiBhcy5udW1lcmljKC54KSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIjIwMjEgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYWN0b3IgdHlwZSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIiksIGRpZ2l0cyA9IDApICU+JSANCiAga2FibGVfY2xhc3NpY18yKCkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KYGBgDQoNCjxicj48YnI+DQoNCg0KIyMjIDUuMyBBY3RvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb3N0IGZhdGFsaXRpZXMNCg0KQ29uZmxpY3QgZXZlbnRzIGJldHdlZW4gdGhlIE15YW5tYXIgTWlsaXRhcnkgYW5kIHRoZSBQZW9wbGXigJlzIERlZmVuc2UgRm9yY2UgYWNjb3VudGVkIGZvciB0aGUgZ3JlYXRlc3QgbnVtYmVyIG9mIGZhdGFsaXRpZXMgaW4gMjAyMS4gVGhpcyBpcyBzaWduaWZpY2FudCBnaXZlbiB0aGF0IHRoZSBQZW9wbGXigJlzIERlZmVuc2UgRm9yY2UgKFBERikgd2FzIG9ubHkgY3JlYXRlZCBpbiBNYXkgb2YgbGFzdCB5ZWFyLiBJbiB0b3RhbCwgMywxNDMgZmF0YWxpdGllcyByZXN1bHRlZCBmcm9tIGNvbmZsaWN0IGV2ZW50cyBpbnZvbHZpbmcgdGhlIE1pbGl0YXJ5IGFuZCB0aGUgUERGLg0KDQpDb25mbGljdCBiZXR3ZWVuIGNpdmlsaWFucyBhbmQgdGhlIE1pbGl0YXJ5IHdhcyB0aGUgc2Vjb25kIG1vc3QtbGlrZWx5IHR5cGUgb2YgY29uZmxpY3QgZXZlbnQgdG8gY2F1c2UgZmF0YWxpdGllcy4gSW4gdG90YWwsIDk2NiBwZW9wbGUgZGllZCBmcm9tIHRoaXMgdGhpcyB0eXBlIG9mIGNvbmZsaWN0Lg0KDQpUaGUgbGlzdCBiZWxvdyBzaG93cyB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYXNzb2NpYXRlZCB3aXRoIGludGVyYWN0aW9ucyBiZXR3ZWVuIGEgZ2l2ZW4gcGFpciBvZiBhY3RvcnMuIE9ubHkgdGhlIHRvcCAyMCBwYWlycywgaW4gdGVybXMgb2YgZmF0YWxpdGllcywgYXJlIHNob3duLiBPZiBjb25jZXJuIGlzIHRoYXQgY2l2aWxpYW5zIGFzIGFjdG9ycyBhcHBlYXIgaW4gdGhlIGxpc3QsIGJvdGggaW4gaW50ZXJhY3Rpb25zIHdpdGggdGhlIE1pbGl0YXJ5IGFuZCB3aXRoIFVuaWRlbnRpZmllZCBBcm1lZCBHcm91cHMgZmlnaHRpbmcgbWlsaXRhcnkgZm9yY2VzLg0KDQoNCg0KYGBge3IgdGFibGUtYWN0b3ItcGFpcnMtZmF0YWxpdGllc30NCmFjdG9ycyAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZmlsdGVyKHN1Yl9ldmVudF90eXBlICE9ICJQZWFjZWZ1bCBwcm90ZXN0IikgJT4lIA0KICBwYWlyd2lzZV9jb3VudChhY3Rvcl9zaW1wbGUsIGRhdGFfaWQsIHNvcnQgPSBUUlVFLCB1cHBlciA9IEZBTFNFLCB3dCA9IGZhdGFsaXRpZXMpICU+JSANCiAgdHJhbnNtdXRlKEFjdG9yMSA9IGl0ZW0xLCANCiAgICAgICAgICAgIEFjdG9yMiA9IGl0ZW0yLA0KICAgICAgICAgICAgRmF0YWxpdGllcyA9IG4pICU+JSANCiAgaGVhZCgyMCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkNvbmZsaWN0IGFjdG9yIHBhaXJzIHdpdGggdGhlIGhpZ2hlc3QgZmF0YWxpdGllcyBpbiAyMDIxIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSAlPiUgDQogIGZvb3Rub3RlKCJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIGdlbmVyYWxfdGl0bGUgPSAiIikNCmBgYA0KDQo8YnI+DQoNCkFDTEVEIGRvZXMgbm90IGNvbGxlY3QgZGF0YSBvbiB0aGUgYWN0b3IgcmVzcG9uc2libGUgZm9yIGEgZmF0YWxpdHkuIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBkaXN0aW5ndWlzaCB3aGV0aGVyIGEgZmF0YWxpdHkgd2FzIGNhdXNlZCBieSB0aGUgb3RoZXIgYWN0b3IgaW4gYSBjb25mbGljdCwgb3IgYXMgYSByZXN1bHQgb2YgdGhlIGFjdGlvbnMgb2YgdGhlIHBlcnNvbiB0aGF0IGRpZXMuDQpEZXNwaXRlIHRoaXMsIGl0IGlzIGludGVyZXN0aW5nIHRvIHNlZSB3aGljaCBhY3RvcnMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9zdCBmYXRhbGl0aWVzLCBhbmQgbWF5IGJlIGNvbnNpZGVyZWQgdGhlIOKAmGJsb29kaWVzdOKAmS4NCg0KVGhlIHBsb3QgYmVsb3cgc2hvd3MgdGhlIGFjdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIG1vc3QgZmF0YWxpdGllcywgcGVyIGV2ZW50LiBPbmx5IGFjdG9ycyB3aG8gcGFydGljaXBhdGVkIGluIG1vcmUgdGhhbiA1MCBjb25mbGljdCBldmVudHMgZHVyaW5nIDIwMjEgYXJlIGluY2x1ZGVkLiANCg0KRWFjaCBwb2ludCBzaG93cyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgZmF0YWxpdGllcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjdG9yIGZvciBlYWNoIGNvbmZsaWN0IGV2ZW50IGl0IHBhcnRpY2lwYXRlZCBpbi4gVGhlIHdoaXNrZXJzIHNob3cgdGhlIHJhbmdlIG9mIGZhdGFsaXRpZXMgYWNyb3NzIGV2ZW50cywgd2l0aCBhdCBsZWFzdCA5NSBwZXJjZW50IG9mIGFsbCBjb25mbGljdCBldmVudHMgY292ZXJlZCB3aXRoaW4gdGhlIHJhbmdlLiANCg0KUG9saXRpY2FsIG1pbGl0aWFzIGFuZCByZWJlbCBncm91cHMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGlnaGVzdCBmYXRhbGl0eSBldmVudHMsIHdoaWNoIGlzIG5vdCBzdXJwcmlzaW5nIGdpdmVuIHRoYXQgaW5jaWRlbnRzIGJldHdlZW4gdGhlIFBlb3BsZeKAmXMgRGVmZW5zZSBGb3JjZSBhbmQgdGhlIE1pbGl0YXJ5IHJlc3VsdGVkIGluIHRoZSBoaWdoZXN0IG51bWJlciBvZiBmYXRhbGl0aWVzLCBhcyBzaG93biBhYm92ZS4NCg0KDQo8YnI+DQoNCmBgYHtyIGZhdGFsaXRpZXMtYWN0b3JzLWVycm9yYmFyaCwgZmlnLmhlaWdodD02fQ0KYWN0b3JzX2NvbmZfaW50IDwtIGFjdG9ycyAlPiUgIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGFkZF9jb3VudChhY3Rvcl9zaW1wbGUpICU+JSANCiAgZmlsdGVyKG4gPiA1MCkgJT4lIA0KICBuZXN0KC1hY3Rvcl9zaW1wbGUpICU+JSANCiAgbXV0YXRlKG1vZGVsID0gbWFwKGRhdGEsIH4gdC50ZXN0KC4kZmF0YWxpdGllcykpKSAlPiUgDQogIHVubmVzdF9sZWdhY3kobWFwKG1vZGVsLCB0aWR5KSkNCg0KYWN0b3JzX2NvbmZfaW50ICU+JSAgDQogIGxlZnRfam9pbihhY3RvcnMgJT4lIHNlbGVjdChhY3Rvcl9zaW1wbGUsIGludGVyMSkgJT4lIGRpc3RpbmN0KCksIGJ5ID0gImFjdG9yX3NpbXBsZSIpICU+JSANCiAgbXV0YXRlKGludGVyMSA9IGZjdF9yZWxldmVsKGludGVyMSwgYygicHJvdGVzdGVycyIsICJjaXZpbGlhbnMiLCAic3RhdGVfZm9yY2VzIiwgInBvbGl0aWNhbF9taWxpdGlhcyIsICJyZWJlbF9ncm91cHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaW90ZXJzIiwgImlkZW50aXR5X21pbGl0aWFzIiwgImV4dGVybmFsX290aGVyX2ZvcmNlIikpKSAlPiUgDQogIG11dGF0ZShhY3Rvcl9zaW1wbGUgPSBzdHJfcmVtb3ZlKGFjdG9yX3NpbXBsZSwgIlxcOi4qIiksDQogICAgICAgICBhY3Rvcl9zaW1wbGUgPSBmY3RfcmVvcmRlcihhY3Rvcl9zaW1wbGUsIGVzdGltYXRlKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBlc3RpbWF0ZSwgeSA9IGFjdG9yX3NpbXBsZSwgY29sb3VyID0gaW50ZXIxKSkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMikgKyANCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBjb25mLmxvdywgeG1heCA9IGNvbmYuaGlnaCksIGhlaWdodCA9IDAuMTUpICsgDQogIHNjYWxlX2NvbG91cl92aXJpZGlzX2QoZGlyZWN0aW9uID0gLTEpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA3LCBieSA9IDEpKSArDQogICMgc2NhbGVfY29sb3VyX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKyANCiAgbGFicyh4ID0gIkF2ZXJhZ2UgbnVtYmVyIG9mIGZhdGFsaXRpZXMgcGVyIGNvbmZsaWN0IGV2ZW50IiwNCiAgICAgIHkgPSAiQ29uZmxpY3QgYWN0b3IiLCANCiAgICAgIHRpdGxlID0gIldoaWNoIGNvbmZsaWN0IGFjdG9ycyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb3N0IGZhdGFsaXRpZXMgcGVyIGV2ZW50PyIsIA0KICAgICAgc3VidGl0bGUgPSAiT25seSBpbmNsdWRlcyBhY3RvcnMgaW52b2x2ZWQgaW4gbW9yZSB0aGFuIDUwIGNvbmZsaWN0IGV2ZW50cyIsIA0KICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsDQogICAgICBjb2xvdXIgPSAiIikgKyANCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQobnJvdyA9IDEpKQ0KDQpgYGANCg0KPGJyPjxicj4gDQoNCiMjIyA1LjQgU3VtbWFyeSB0YWJsZSBvZiBtYWluIGNvbmZsaWN0IGFjdG9ycyBieSBhY3RvciB0eXBlDQoNCmBgYHtyIHRhYmxlLW1haW4tY29uZmxpY3QtYWN0b3JzfQ0KdG9wX2FjdG9ycyA8LSBhY3RvcnMgJT4lICANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSAmIGludGVyMSAhPSAiZXh0ZXJuYWxfb3RoZXJfZm9yY2UiKSAlPiUNCiAgZ3JvdXBfYnkoaW50ZXIxKSAlPiUgDQogIG11dGF0ZShhY3Rvcl9zaW1wbGUgPSBmY3RfbHVtcChhY3Rvcl9zaW1wbGUsIHByb3AgPSAuMDIpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGNvdW50KGludGVyMSwgYWN0b3Jfc2ltcGxlLCBzb3J0ID0gVFJVRSkgJT4lIA0KICBncm91cF9ieShpbnRlcjEpICU+JSANCiAgbXV0YXRlKGAlX29mX2dyb3VwYCA9IHJvdW5kKG4gLyBzdW0obikgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgaW50ZXIxID0gc3RyX3RvX3RpdGxlKGludGVyMSkpICU+JQ0KICByZW5hbWUoRXZlbnRzID0gbiwNCiAgICAgICAgIGBBY3RvciB0eXBlYCA9IGludGVyMSwNCiAgICAgICAgIGBBY3RvciBuYW1lYCA9IGFjdG9yX3NpbXBsZSkgJT4lIA0KICAjIHRvcF9uKG4gPSA1KSAlPiUgDQogIGFycmFuZ2UoYEFjdG9yIHR5cGVgKQ0KDQprYWJsZSh0b3BfYWN0b3JzLCBjYXB0aW9uID0gIlRvcCBjb25mbGljdCBhY3RvcnMgaW4gMjAyMSBieSBhY3RvciB0eXBlIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBwYWNrX3Jvd3MoaW5kZXggPSB0YWJsZSh0b3BfYWN0b3JzJGBBY3RvciB0eXBlYCkpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lICANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQoNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDUuNSBHZW9ncmFwaGljIGRpc3RyaWJ1dGlvbiBvZiBjb25mbGljdCBhY3RvcnMNCg0KU2FnYWluZyBpcyBob21lIHRvIGEgaHVnZSBjb25jZW50cmF0aW9uIG9mIGNvbmZsaWN0IGFjdG9ycywgd2l0aCBtYW55IG1vcmUgdGhhbiBpbiB0aGUgdHJhZGl0aW9uYWwgY29uZmxpY3QgYXJlYXMgb2YgS2FjaGluLCBub3J0aGVybiBTaGFuIGFuZCBSYWtoaW5lLg0KDQo8YnI+DQoNCmBgYHtyIG1hcC1jb25mbGljdC1hY3RvcnMtdG93bnNoaXAsIGZpZy5oZWlnaHQ9MTB9DQphY3RvcnMgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UoY29uZmxpY3RfYWN0b3JzID0gbl9kaXN0aW5jdChhY3Rvcl9zaW1wbGUpKSAlPiUgDQogIGxlZnRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2YoYWVzKGZpbGwgPSBjb25mbGljdF9hY3RvcnMpLCBzaXplID0gMC4wMSkgKw0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIHNpemUgPSAwLjUsIGNvbG91ciA9ICJibGFjayIsIGFscGhhID0gMCkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1hZ21hIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgbGFicyhmaWxsID0gIm51bWJlciBvZlxuIGNvbmZsaWN0IGFjdG9ycyIsDQogICAgICAgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIDIwMjEgY29uZmxpY3QgYWN0b3JzIGF0IHRvd25zaGlwIGxldmVsIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIikNCiAgDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KDQoNCg0KIyMgNi4gQ29ycmVsYXRpb25zIGJldHdlZW4gY29uZmxpY3QgYW5kIGZvb2Qgc2VjdXJpdHkgY2x1c3RlciBmb290cHJpbnQgDQoNCg0KIyMjIDYuMSBDb3JyZWxhdGlvbiBwbG90DQoNCg0KYGBge3IgY29uZmxpY3Qtc2NvcmUtZGYsIHdhcm5pbmc9RkFMU0V9DQpjb25mbGljdF9kZiA8LSBhY2xlZCAlPiUgDQogICMgZG8geW91IHJlYWxseSBuZWVkIHRoaXMgc3RlcCBzaW5jZSB5b3UncmUgdXNpbmcgQmV0dGktVmVybWENCiAgbXV0YXRlKGV2ZW50X3R5cGUgPSBjYXNlX3doZW4oZXZlbnRfdHlwZSA9PSAiUHJvdGVzdHMiIH4gIlByb3Rlc3RzX2FuZF9SaW90cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGUgPT0gIlJpb3RzIiB+ICJQcm90ZXN0c19hbmRfUmlvdHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGV2ZW50X3R5cGUpKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEgJiBzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JQ0KICBncm91cF9ieShhZG1pbjNfcGNvZGUsIGV2ZW50X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZXZlbnRfdHlwZSwgdmFsdWVzX2Zyb20gPSBjb3VudCkgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGJhdHRsZXMgPSAwLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSA9IDAsIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zID0gMCwNCiAgICAgICAgICAgICAgICAgIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMgPSAwLCBwcm90ZXN0c19hbmRfcmlvdHMgPSAwKSkgJT4lIA0KICAjIG11dGF0ZSh0b3RhbF9ldmVudHMgPSByb3dTdW1zKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSksIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbGVmdF9qb2luKGFjbGVkICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHVuZ3JvdXAoKQ0KICANCmluZGV4X3NoYXJlcyA8LSBjb25mbGljdF9kZiAlPiUgICANCiAgbXV0YXRlX2F0KHZhcnMoYyhiYXR0bGVzLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMsIGZhdGFsaXRpZXMsDQogICAgICAgICAgICAgICAgICAgc3RyYXRlZ2ljX2RldmVsb3BtZW50cywgcHJvdGVzdHNfYW5kX3Jpb3RzKSksIA0KICAgICAgICAgICBzY2FsZSkgJT4lICANCiAgbXV0YXRlX2F0KHZhcnMoYyhiYXR0bGVzLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMsIGZhdGFsaXRpZXMsDQogICAgICAgICAgICAgICAgICAgc3RyYXRlZ2ljX2RldmVsb3BtZW50cywgcHJvdGVzdHNfYW5kX3Jpb3RzKSksIA0KICAgICAgICAgICBmdW5zKCguIC0gbWluKC4sIG5hLnJtID0gVCkpLyhtYXgoLiwgbmEucm0gPSBUKSAtIG1pbiguLCBuYS5ybSA9IFQpKSkpICU+JSANCiAgbWRlcHJpdihjKCJiYXR0bGVzIiwgImV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlIiwgInZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zIiwgImZhdGFsaXRpZXMiLCAic3RyYXRlZ2ljX2RldmVsb3BtZW50cyIsICJwcm90ZXN0c19hbmRfcmlvdHMiKSwNCiAgICAgICAgICBtZXRob2QgPSAiYnYiLCBvdXRwdXQgPSAiYWxsIikNCg0KY29uZmxpY3Rfc2NvcmUgPC0gY29uZmxpY3RfZGYgJT4lIA0KICBsZWZ0X2pvaW4oaW5kZXhfc2hhcmVzJGRhdGEgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYWRtaW4zX3Bjb2RlLCANCiAgICAgICAgICAgICAgICAgICAgIHNjb3JlX2ksDQogICAgICAgICAgICAgICAgICAgICBpbmRleF9iYXR0bGVzID0gYmF0dGxlcywgDQogICAgICAgICAgICAgICAgICAgICBpbmRleF9leHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSA9IGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLA0KICAgICAgICAgICAgICAgICAgICAgaW5kZXhfdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMgPSB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgDQogICAgICAgICAgICAgICAgICAgICBpbmRleF9mYXRhbGl0aWVzID0gZmF0YWxpdGllcywgDQogICAgICAgICAgICAgICAgICAgICBpbmRleF9zdHJhdGVnaWNfZGV2ZWxvcG1lbnRzID0gc3RyYXRlZ2ljX2RldmVsb3BtZW50cywgDQogICAgICAgICAgICAgICAgICAgICBpbmRleF9wcm90ZXN0c19hbmRfcmlvdHMgPSBwcm90ZXN0c19hbmRfcmlvdHMpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShlbnZfYmF0dGxlcyA9IGJhdHRsZXMgLyBtYXgoYmF0dGxlcyksIA0KICAgICAgICAgZW52X2V4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlID0gZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgLyBtYXgoZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UpLA0KICAgICAgICAgZW52X3Zpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zID0gdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMgLyBtYXgodmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMpLCANCiAgICAgICAgIGVudl9mYXRhbGl0aWVzID0gZmF0YWxpdGllcyAvIG1heChmYXRhbGl0aWVzKSwgDQogICAgICAgICBzY29yZV9lbnYgPSAoZW52X2JhdHRsZXMgKyBlbnZfZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgKyBlbnZfdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMgKyBlbnZfZmF0YWxpdGllcykgLyA0KSAlPiUgDQogIGxlZnRfam9pbihhY2xlZCAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KGFkbWluMSwgYWRtaW4zLCBhZG1pbjNfcGNvZGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihmc2MgJT4lICANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllc1t1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIl0pKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikNCg0KIyBjb25mbGljdF9zY29yZSAlPiUgZG8uY2FsbChkYXRhLmZyYW1lLCAuKSAlPiUgYXNfdGliYmxlKCkgJT4lIHdyaXRlX2NzdigiY29uZmxpY3Rfc2NvcmUuY3N2IikNCmBgYA0KDQoNCkZvb2Qgc2VjdXJpdHkgcGFydG5lcnMgYXJlIG5vdCBvcGVyYXRpbmcgaW4gdGhlIHBhcnRzIG9mIE15YW5tYXIgbW9zdCBhZmZlY3RlZCBieSBjb25mbGljdCBpbiAyMDIxLCBhcyBzaG93biBwcmV2aW91c2x5IGluIFNlY3Rpb24gMi4gU2FnYWluZyByZWdpb24gZXhwZXJpZW5jZWQgdGhlIG1vc3QgY29uZmxpY3QgaW4gMjAyMSwgZm9sbG93ZWQgYnkgS2FjaGluIGFuZCBub3J0aGVybiBTaGFuLCBob3dldmVyIGh1bWFuaXRhcmlhbiBwYXJ0bmVycyBjb250aW51ZSB0byB3b3JrIGluIFJha2hpbmUsIEthY2hpbiBhbmQgc291dGhlcm4gU2hhbiwgd2l0aCBzb21lIHNoaWZ0IHRvd2FyZHMgd29ya2luZyBpbiBwZXJpLXVyYmFuIFlhbmdvbiBhbmQgTWFuZGFsYXkuDQoNClRoZSBwbG90IGJlbG93IGNvcnJlbGF0ZXMgY29uZmxpY3QgaW5kaWNhdG9ycyB3aXRoIHRoZSBudW1iZXIgb2YgRlNDIHBhcnRuZXJzIGFuZCBiZW5lZmljaWFyaWVzIGF0IHRvd25zaGlwIGxldmVsLiANCg0KVGhlIGRhcmtlciB0aGUgY29sb3Igb2YgdGhlIGNpcmNsZSBhbmQgdGhlIGxhcmdlciB0aGUgc2l6ZSwgaXMgYW4gaW5kaWNhdGlvbiBvZiBhIGdyZWF0ZXIgdGhlIGRlZ3JlZSBvZiBjb3JyZWxhdGlvbiwgd2l0aCArMSBiZWluZyBhIHBlcmZlY3QgcG9zaXRpdmUgY29ycmVsYXRpb24gYW5kIC0xIGJlaW5nIGEgcGVyZmVjdCBuZWdhdGl2ZSBjb3JyZWxhdGlvbi4gDQoNCkFzIG1heSBiZSBleHBlY3RlZCwgY29uZmxpY3QgaW5kaWNhdG9ycyBhcmUgaGlnaGx5IGNvcnJlbGF0ZWQgd2l0aCBlYWNoIG90aGVyLiBXaGF0IGlzIG9mIGNvbmNlcm4gaXMgdGhlIHZlcnkgd2VhayBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBwcmVzZW5jZSBvZiBGb29kIFNlY3VyaXR5IENsdXN0ZXIgcGFydG5lcnMgYW5kIGJlbmVmaWNpYXJpZXMgaW4gcmVsYXRpb24gdG8gdGhlIGluY2lkZW5jZSBvZiBjb25mbGljdC4NCg0KDQo8YnI+DQoNCmBgYHtyIHNtYWxsLWNvcnJwbG90fQ0KDQpjb25mbGljdF9zY29yZSAlPiUgDQogIHNlbGVjdChiYXR0bGVzLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgcHJvdGVzdHNfYW5kX3Jpb3RzLCBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgDQogICAgICAgICBmYXRhbGl0aWVzLCBwYXJ0bmVycywgYmVuZWZpY2lhcmllcykgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHBhcnRuZXJzKSAmICFpcy5uYShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBjb3IobWV0aG9kID0gYygicGVhcnNvbiIpKSAlPiUgDQogIGNvcnJwbG90KHR5cGUgPSAidXBwZXIiLCBjb2wgPSBicmV3ZXIucGFsKG4gPSA4LCBuYW1lID0gIlJkWWxCdSIpLCB0bC5zcnQgPSAzNSwgDQogICAgICAgICAgIHRpdGxlID0gIkNvcnJlbGF0aW9uIHBsb3QgYmV0d2VlbiBjb25mbGljdCBpbmRpY2F0b3JzIGFuZCBGU0MgcHJlc2VuY2UgXG4iLCAgbWFyPWMoMCwwLDIsMCksIGRpYWcgPSBGQUxTRSkNCiAgDQpgYGANCg0KPGJyPg0KDQpUaGUgcGxvdCBiZWxvdyB1c2VzIHRoZSBzYW1lIHZhcmlhYmxlcyBhcyBhYm92ZSwgYnV0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIGFuZCBpbmZvcm1hdGlvbi4gDQoNClRoZSBwbG90IGlzIHNwbGl0IGludG8gYW4gdXBwZXIgYW5kIGxvd2VyIHRyaWFuZ2xlLCBkaXZpZGVkIGRpYWdvbmFsbHkgYnkgdGhlIGJsdWUgaGlzdG9ncmFtcy4NCg0KVGhlIG51bWJlcnMgaW4gdGhlIHVwcGVyIHRyaWFuZ2xlIGFyZSB0aGUgc3BlY2lmaWMgbnVtZXJpYyB2YWx1ZXMgb2YgdGhlIGJsdWUgYW5kIHllbGxvdyBjaXJjbGVzIGluIHRoZSBwbG90IGFib3ZlLCBpbmRpY2F0aW5nIHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBvZiBiZXR3ZWVuICsxIGFuZCDigJMxLiBUaGUgYXN0ZXJpc2tzIGRlbm90ZSB0aGUgbGV2ZWwgb2Ygc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIG9mIHRoZSBjb3JyZWxhdGlvbnMuIA0KVGhlIGhpc3RvZ3JhbXMgc2hvdyB0aGUgZGlzdHJpYnV0aW9uIG9mIGVhY2ggdmFyaWFibGUuIEZvciB0aGUgY29uZmxpY3QgdmFyaWFibGVzIHRoZSBiYXJzIGFyZSBza2V3ZWQgdG8gdGhlIGxlZnQsIGluZGljYXRpbmcgdGhhdCBtb3N0IHRvd25zaGlwcyBleHBlcmllbmNlZCByZWxhdGl2ZWx5IGxvdyBsZXZlbHMgb2YgY29uZmxpY3QuDQoNClRoaXMgaXMgYm9ybmUgb3V0IGluIGFuIGV4YW1pbmF0aW9uIG9mIHRoZSBsb3dlciB0cmlhbmdsZSwgd2hlcmUgZWFjaCBwb2ludCBpcyBhIHRvd25zaGlwIGFuZCB0aGUgcmVkIGxpbmUgc2hvd3MgdGhlIGxpbmVhciBmaXQgYmV0d2VlbiBlYWNoIHBhaXIgb2YgdmFyaWFibGVzLiBNb3N0IHRvd25zaGlwcyB0ZW5kIHRvIGJlIGNvbmNlbnRyYXRlZCBhcm91bmQgdGhlIGJvdHRvbS1sZWZ0IHF1YWRyYW50IG9mIHRoZSBjaGFydCwgd2l0aCBtYW55IG91dGxpZXJzLiBUaGUgc3RlZXBlciB0aGUgZ3JhZGllbnQgb2YgcmVkIGxpbmUsIHRoZSBzdHJvbmdlciB0aGUgY29ycmVsYXRpb24uDQoNCkZvciBpbnN0YW5jZSwgdGhlIHR3byB2YXJpYWJsZXMgbW9zdCBoaWdobHktY29ycmVsYXRlZCB3aXRoIGVhY2ggb3RoZXIgYXJlIHZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIGFuZCBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzOiB0aGV5IHNoYXJlIGEgY29ycmVsYXRpb24gY29lZmZpY2llbnQgb2YgMC43OSwgbWVhbmluZyB0aGF0IGluIDc5JSBvZiB0aGUgdG93bnNoaXBzIGluIHdoaWNoIHZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIG9jY3VycmVkLCBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzIGFsc28gdG9vayBwbGFjZSAodGhlIG1vc3QgY29tbW9uIHN0cmF0ZWdpYyBkZXZlbG9wbWVudHMgd2VyZSBhcnJlc3RzIGFuZCBwcm9wZXJ0eSBkYW1hZ2UpLiBUaGlzIHJlbGF0aW9uc2hpcCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCB0aGF0IGlzIHRvIHNheSwgaXQgd2FzIG5vdCBieSBjaGFuY2UgdGhhdCB0aGVzZSB0d28gdHlwZXMgb2YgY29uZmxpY3QgZXZlbnRzIHRlbmRlZCB0byBvY2N1ciBpbiB0aGUgc2FtZSBwbGFjZXMuDQoNCjxicj4NCg0KYGBge3IgY29ycnBsb3QsIGZpZy5oZWlnaHQ9Ny41fQ0KY29uZmxpY3Rfc2NvcmUgJT4lIA0KICBtdXRhdGUobG9nX2JlbmVmaWNpYXJpZXMgPSBsb2coYmVuZWZpY2lhcmllcykpICU+JSANCiAgc2VsZWN0KGJhdHRsZXMsIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgcHJvdGVzdHNfYW5kX3Jpb3RzLCBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzLCANCiAgICAgICAgIGZhdGFsaXRpZXMsIHBhcnRuZXJzLCBsb2dfYmVuZWZpY2lhcmllcykgJT4lDQogIHBhaXJzLnBhbmVscyhzbW9vdGggPSBUUlVFLCAgICAgICMgSWYgVFJVRSwgZHJhd3MgbG9lc3Mgc21vb3Rocw0KICAgICAgICAgICAgICAgc2NhbGUgPSBGQUxTRSwgICAgICAjIElmIFRSVUUsIHNjYWxlcyB0aGUgY29ycmVsYXRpb24gdGV4dCBmb250DQogICAgICAgICAgICAgICBkZW5zaXR5ID0gVFJVRSwgICAgICMgSWYgVFJVRSwgYWRkcyBkZW5zaXR5IHBsb3RzIGFuZCBoaXN0b2dyYW1zDQogICAgICAgICAgICAgICBlbGxpcHNlcyA9IEZBTFNFLCAgICMgSWYgVFJVRSwgZHJhd3MgZWxsaXBzZXMNCiAgICAgICAgICAgICAgIG1ldGhvZCA9ICJwZWFyc29uIiwgIyBDb3JyZWxhdGlvbiBtZXRob2QgKGFsc28gInNwZWFybWFuIiBvciAia2VuZGFsbCIpDQogICAgICAgICAgICAgICBwY2ggPSA4LCAgICAgICAgICAgICMgcGNoIHN5bWJvbA0KICAgICAgICAgICAgICAgbG0gPSBUUlVFLCAgICAgICAgICAjIElmIFRSVUUsIHBsb3RzIGxpbmVhciBmaXQgcmF0aGVyIHRoYW4gdGhlIExPRVNTIChzbW9vdGhlZCkgZml0DQogICAgICAgICAgICAgICBjb3IgPSBUUlVFLCAgICAgICAgICMgSWYgVFJVRSwgcmVwb3J0cyBjb3JyZWxhdGlvbnMNCiAgICAgICAgICAgICAgIGppZ2dsZSA9IEZBTFNFLCAgICAgIyBJZiBUUlVFLCBkYXRhIHBvaW50cyBhcmUgaml0dGVyZWQNCiAgICAgICAgICAgICAgIGZhY3RvciA9IDIsICAgICAgICAgIyBKaXR0ZXJpbmcgZmFjdG9yDQogICAgICAgICAgICAgICBoaXN0LmNvbCA9IDQsICAgICAgICMgSGlzdG9ncmFtcyBjb2xvcg0KICAgICAgICAgICAgICAgc3RhcnMgPSBUUlVFLCAgICAgICAjIElmIFRSVUUsIGFkZHMgc2lnbmlmaWNhbmNlIGxldmVsIHdpdGggc3RhcnMNCiAgICAgICAgICAgICAgIGNpID0gRkFMU0UsICAgICAgICAgIyBJZiBUUlVFLCBhZGRzIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogICAgICAgICAgICAgICBtYWluID0gIkNvcnJlbGF0aW9uIHBsb3Qgb2YgY29uZmxpY3QgaW5kaWNhdG9ycyAoYWNsZWRkYXRhLmNvbSkgYW5kIEZTQyBwYXJ0bmVycyBhbmQgYmVuZWZpY2lhcmllcyIpDQpgYGANCg0KDQpUaGUgbnVtYmVycyBvZiBwYXJ0bmVycyBhbmQgYmVuZWZpY2lhcmllcyBwZXIgdG93bnNoaXAgd2VyZSwgdW5zdXJwcmlzaW5nbHksIGNvcnJlbGF0ZWQgd2l0aCBlYWNoIG90aGVyLiBIb3dldmVyLCB0aGUgbnVtYmVyIG9mIHBhcnRuZXJzIHBlciB0b3duc2hpcCB3YXMgb25seSBzbGlnaHRseSBjb3JyZWxhdGVkIHdpdGggdGhlIG51bWJlciBvZiBiYXR0bGVzIGFuZCB0aGUgbnVtYmVyIG9mIGV4cGxvc2lvbnMgYW5kIHJlbW90ZSB2aW9sZW5jZSDigJMgdGhpcyBwYXR0ZXJuIGxpa2VseSBvbmx5IGhvbGRzIGZvciBjZXJ0YWluIHN0YXRlcy4gVGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaXMgbm90IGNvcnJlbGF0ZWQgd2l0aCBhbnkgY29uZmxpY3QgaW5kaWNhdG9ycyANCg0KDQo8YnI+PGJyPg0KDQojIyMgNi4yIENvbmZsaWN0IHNjb3JlIGFuZCBiZW5lZmljaWFyaWVzIHJlYWNoZWQNCg0KQSBjb25mbGljdCBzY29yZSwgYXQgaXRzIG1vc3QgYmFzaWMsIGlzIGFuIGF2ZXJhZ2Ugb2YgdGhlIG5vcm1hbGl6ZWQgdmFsdWVzIG9mIGtleSBjb25mbGljdCBpbmRpY2F0b3JzLiBJdHMgbWFpbiB1c2UgaXQgdG8gYWlkIGRlY2lzaW9ucyBhYm91dCBnZW9ncmFwaGljIHByaW9yaXRpemF0aW9uLiBVc2luZyBBQ0xFRCBkYXRhLCBhIGNvbmZsaWN0IHNjb3JlIHdhcyBjYWxjdWxhdGVkIGF0IHRvd25zaGlwIGxldmVsLCBhbmQgdGhpcyBpcyBzaG93biBwbG90dGVkIGFnYWluc3QgZm9vZCBzZWN1cml0eSBiZW5lZmljaWFyeSByZWFjaCBpbiAyMDIxLiBUaGUgY29uZmxpY3Qgc2NvcmUgaGVyZSBpcyBhbiB1cGRhdGUgb2YgdGhlIGNvbmZsaWN0IGluZGV4IGluIHRoZSBbTUlNVS1IQVJQIFZ1bG5lcmFiaWxpdHkgQW5hbHlzaXNdKGh0dHA6Ly90aGVtaW11LmluZm8vdnVsbmVyYWJpbGl0eS1pbi1teWFubWFyKSwgdXNpbmcgMjAyMSBkYXRhLiBUaGUgc3BlY2lmaWMgY29uZmxpY3QgdmFyaWFibGVzIHRoYXQgaW5jbHVkZWQgaW4gdGhlIHNjb3JlIHdlcmUgYmF0dGxlcywgZXhwbG9zaW9ucyBhbmQgcmVtb3RlIHZpb2xlbmNlLCBub24tcGVhY2VmdWwgcHJvdGVzdHMgYW5kIHJpb3RzLCBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMgYW5kIHN0cmF0ZWdpYyBkZXZlbG9wbWVudHMuIA0KDQpUaGUgc3ByZWFkIG9mIGJlbmVmaWNpYXJpZXMgc2hvd3Mgbm8gZGlzY2VybmlibGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGluY2lkZW5jZSBvZiBjb25mbGljdCBhbmQgdGhlIGJlbmVmaWNpYXJpZXMgYmVpbmcgcmVhY2hlZC4gUGxlYXNlIGRvd25sb2FkIHRoZSBjb2RlIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIvZXhwbG9yYXRvcnktZGF0YS1hbmFseXNpcy1hY2xlZC1mc2MvYmxvYi9tYXN0ZXIvYWNsZWQuUm1kKSB0byBzZWUgaW4gZGV0YWlsIGhvdyB0aGUgY29uZmxpY3Qgc2NvcmUgd2FzIGNhbGN1bGF0ZWQuIA0KDQo8YnI+DQoNCmBgYHtyIHNjb3JlLWktYmVuLXBsb3R9DQojIHRoZXJlIGlzIG5vIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbmZsaWN0IHNjb3JlIGFuZCB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgb3IgbnVtYmVyIG9mIHBhcnRuZXJzIHBlciB0b3duc2hpcA0KY29uZmxpY3Rfc2NvcmUgJT4lDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBzY29yZV9pKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGxhYmVscyA9IGNvbW1hKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIiwNCiAgICAgICB5ID0gIkNvbmZsaWN0IHNjb3JlIiwgDQogICAgICAgdGl0bGUgPSAiUmVsYXRpb25zaGlwIGJldHdlZW4gYmVuZWZpY2lhcmllcyByZWFjaGVkIGFuZCBjb25mbGljdCBzY29yZSBhdCB0b3duc2hpcCBsZXZlbCIsDQogICAgICAgc3VidGl0bGUgPSAiSGlnaGVyIGNvbmZsaWN0IHNjb3JlcyBpbmRpY2F0ZSBtb3JlIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2VzOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIGFuZCBGb29kIFNlY3VyaXR5IENsdXN0ZXIgTXlhbm1hciIpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNi4zIFRvd25zaGlwLWxldmVsIGRpc3RyaWJ1dGlvbiBvZiBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMNCg0KVG93bnNoaXBzIHRoYXQgZXhwZXJpZW5jZSB0aGUgbW9zdCBjb25mbGljdCBldmVudHMgYW5kIGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcywgY29tYmluZWQsIGNhbiBiZSBjb25zaWRlcmVkIHRob3NlIG1vc3QgYWZmZWN0ZWQuDQoNClRoZSBwbG90IGJlbG93IHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIGJ5IHRvd25zaGlwLiBUaGUgdG93bnNoaXBzIGluIHRoZSB1cHBlciByaWdodCBxdWFkcmFudCBhcmUgdGhlIG1vc3QgY29uZmxpY3QtYWZmZWN0ZWQsIG9mIHdoaWNoIHRoZXJlIGFyZSA1Ny4gV2hpbGUgcHJpb3JpdGl6YXRpb24gb2Ygc3VwcG9ydCBpcyBuZWNlc3NhcnksIGl0IHNlZW1zIGNsZWFyIHRoZXNlIHRvd25zaGlwcyBzaG91bGQgYmUgdGFyZ2V0ZWQuDQoNCkZ1cnRoZXIgZGV0YWlsIGlzIHByb3ZpZGVkIGFib3V0IHRoZXNlIHRvd25zaGlwcyBpbiBzZWN0aW9uIDkuMS4NCg0KDQo8YnI+DQoNCmBgYHtyIHNjYXR0ZXJwbG90LWV2ZW50cy1mYXRhbGl0aWVzLXRzcH0NCmFjbGVkICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3RzIikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKGV2ZW50cyA9IG4oKSwNCiAgICAgICAgICAgIGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZXZlbnRzLCB5ID0gZmF0YWxpdGllcykpICsNCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGZhdGFsaXRpZXMsIGNvbG91ciA9IGV2ZW50cykpICsNCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMob3B0aW9uID0gIm1hZ21hIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgYnJlYWtzID0gYygwLCAxLCAxMCwgMzAsIDEwMCwgMzAwLCAxMDAwKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBicmVha3MgPSBjKDAsIDEsIDEwLCAzMCwgMTAwLCAzMDApKSArDQogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSBtZWFuKGZhdGFsaXRpZXMpKSwgY29sb3VyID0gInJlZCIsIGx0eSA9IDIpICsNCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IG1lYW4oZXZlbnRzKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArDQogIGxhYnMoeCA9ICJDb25mbGljdCBldmVudHMiLCANCiAgICAgICB5ID0gIkZhdGFsaXRpZXMiLA0KICAgICAgIHRpdGxlID0gIkNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBieSB0b3duc2hpcCIsIA0KICAgICAgIHN1YnRpdGxlID0gIk1lYW5zIG9mIGJvdGggYXhlcyBhcmUgbWFya2VkIGJ5IHRoZSBkb3R0ZWQgcmVkIGxpbmUiKQ0KICANCiAgDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNy4gQWdyaWN1bHR1cmUgYW5kIGNvbmZsaWN0IA0KDQojIyMgNy4xIFN1bW1hcnkgb2YgYWdyaWN1bHR1cmFsIHN0YXRpc3RpY3MNCg0KYGBge3IgZGYtYWctbWFsaX0NCiMgYWdfbWFsaSBhcmVhcyBzb3dlZCBkYXRhc2V0DQoNCmFnX21hbGkgPC0gdnVsbW1yICU+JSANCiAgc2VsZWN0KHN0YXRlX3JlZ2lvbl9uYW1lLCBzdGF0ZV9yZWdpb25fcGNvZGUsIHRvd25zaGlwX3Bjb2RlLCANCiAgICAgICAgIGNvbnRhaW5zKCJtYWxpIiksIGNvbnRhaW5zKCJzb3duX2FyZWEiKSwgYWxsX2hhcnZlc3RlZF9uZXRfbWFyZ2luX3VzZCwgc293bl9hcmVhX29mX3BhZGR5X2FjcmVzKSAlPiUgDQogIG11dGF0ZShwY19wYWRkeSA9IHNvd25fYXJlYV9vZl9wYWRkeV9hY3JlcyAvIGFsbF9hcmVhX3Nvd2VkX21hbGkpICU+JSANCiAgcmVtb3ZlX2VtcHR5KCkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGNvbnRhaW5zKCJzb3duX2FyZWEiKSwgbmFtZXNfdG8gPSAiY3JvcF90eXBlIiwgdmFsdWVzX3RvID0gImFjcmVzIikgJT4lDQogIGZpbHRlcihjcm9wX3R5cGUgIT0gInNvd25fYXJlYV9vZl9mcmVlbl9ncmFtX2FuZF9wZWdpb25fdXJhZF9wZWFfYWNyZXMiKSAlPiUgDQogIG11dGF0ZShhY3JlcyA9IHJlcGxhY2VfbmEoYWNyZXMsIDApKSAlPiUgDQogIG11dGF0ZShwY190b3RhbCA9IGFjcmVzIC8gYWxsX2FyZWFfc293ZWRfbWFsaSkgJT4lIA0KICBtdXRhdGUoY3JvcF90eXBlID0gc3RyX3JlbW92ZV9hbGwoY3JvcF90eXBlLCAic293bl9hcmVhX29mXyIpLA0KICAgICAgICAgY3JvcF90eXBlID0gc3RyX3JlbW92ZV9hbGwoY3JvcF90eXBlLCAiX2FjcmVzIiksDQogICAgY3JvcF90eXBlID0gaWZlbHNlKGNyb3BfdHlwZSAlaW4lIGMoInBhZGR5IiwgInNlc2FtZSIsICJncmVlbl9ncmFtIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVyYWRfcGVhIiwgImdyb3VuZF9udXQiLCAicGlnZW9uX3BlYSIpLA0KICAgICAgICAgICAgICAgICAgICAgICBjcm9wX3R5cGUsICJvdGhlciIpLCANCiAgICBjcm9wX3R5cGUgPSBmY3RfcmVsZXZlbChjcm9wX3R5cGUsICJvdGhlciIsIGFmdGVyID0gSW5mKSkNCmBgYA0KDQo8YnI+IA0KDQpEZXRhaWxlZCB0b3duc2hpcC1sZXZlbCBhZ3JpY3VsdHVyYWwgc3RhdGlzdGljcyBmb3IgTXlhbm1hciB3ZXJlIGxhc3QgbWFkZSBhdmFpbGFibGUgaW4gMjAxNi4gVGhlc2Ugc3RhdGlzdGljcyB3ZXJlIGluY2x1ZGVkIGluIHRoZSBNSU1VLUhBUlAgcmVwb3J0IFtWdWxuZXJhYmlsaXR5IGluIE15YW5tYXJdKGh0dHA6Ly90aGVtaW11LmluZm8vdnVsbmVyYWJpbGl0eS1pbi1teWFubWFyKS4gDQoNCkhvd2V2ZXIsIHRoZSBzdGF0aXN0aWNzIGFyZSBzb21ld2hhdCBsaW1pdGVkIGluIHZhbHVlIGJlY2F1c2UgdGhleSB3ZXJlIGNvbGxlY3RlZCBhZnRlciBtYWpvciBmbG9vZHMgaW4gMjAxNSBhbmQgd2VyZSB1c2VkIHRvIGRvY3VtZW50IGxvc3NlcyBhbmQgZ3VpZGUgZGV2ZWxvcG1lbnQgb2YgYSBuYXRpb25hbCByZWNvdmVyeSBwbGFuLiBNYW55IG9mIHRoZSAgdmFsdWVzICByZWxhdGVkIHRvIGFyZWFzIGhhcnZlc3RlZCBhcmUgYW5vbWFsb3VzLiBIb3dldmVyLCBhZ3JpY3VsdHVyYWwgYXJlYXMgc293biBhcmUgdW5saWtlbHkgdG8gaGF2ZSBzaGlmdGVkIGdyZWF0bHkgaW4gdGhlIHBhc3QgNiB5ZWFycywgIGluZGVlZCB0aGUgc293biBhcmVhIG9mIHBhZGR5IGZpZWxkcyBvbmx5IHZhcmllZCBieSAwLjElIGJldHdlZW4gMjAxNS8yMDE2IGFuZCAyMDE4LzIwMTkgd2hlbiBjb21wYXJlZCBhdCB0aGUgbmF0aW9uYWwgbGV2ZWwuDQoNClRoZSBwbG90IGJlbG93IHNob3dzIHRoZSBzdGF0ZS9yZWdpb25hbCBicmVha2Rvd24gb2YgdGhlIHRvdGFsIHNvd24gYXJlYSBpbiBhY3JlcyBpbiAyMDE1LzIwMTYsIGJ5IG1ham9yIGNyb3AgdHlwZS4gDQoNCkF5ZXlhcndhZHksIFNhZ2FpbmcsIEJhZ28gYW5kIE1hZ3dheSBjb250YWluIHRoZSBtYWluIGFncmljdWx0dXJhbCBwcm9kdWN0aW9uIGFyZWFzIG9mIE15YW5tYXIuIFRob3VnaCBNYW5kYWxheSwgTWFnd2F5IGFuZCBTYWdhaW5nIHNob3cgYSBtdWNoIGhpZ2hlciBkaXZlcnNpdHkgb2YgY3JvcCB0eXBlcyBjb21wYXJlZCB0byBvdGhlciBzdGF0ZXMvcmVnaW9ucyB3aGljaCBhcmUgZG9taW5hdGVkIGJ5IHBhZGR5IHJpY2UuDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1hcmVhLXNvd24tY3JvcC10eXBlLXNyfQ0KYWdfbWFsaSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlX3JlZ2lvbl9uYW1lLCBjcm9wX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGFjcmVzID0gc3VtKGFjcmVzKSwgLmdyb3VwID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShzdGF0ZV9yZWdpb25fbmFtZSA9IGZhY3RvcihzdGF0ZV9yZWdpb25fbmFtZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkF5ZXlhcndhZHkiLCAiU2FnYWluZyIsICJCYWdvIiwgIk1hZ3dheSIsICJNYW5kYWxheSIsICJTaGFuIiwgIllhbmdvbiIsICJSYWtoaW5lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2F5aW4iLCAiTW9uIiwgIkthY2hpbiIsICJUYW5pbnRoYXJ5aSIsICJLYXlhaCIsICJDaGluIiwgIk5heSBQeWkgVGF3IikpLA0KICAgICAgICAgc3RhdGVfcmVnaW9uX25hbWUgPSBmY3RfcmV2KHN0YXRlX3JlZ2lvbl9uYW1lKSkgJT4lIA0KICBmaWx0ZXIoc3RhdGVfcmVnaW9uX25hbWUgIT0gIk5heSBQeWkgVGF3IikgJT4lIA0KICBhcnJhbmdlKGRlc2MoYWNyZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHN0YXRlX3JlZ2lvbl9uYW1lLCB5ID0gYWNyZXMsIGZpbGwgPSBjcm9wX3R5cGUpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbCA9IGNvbW1hLCBicmVha3MgPSBzZXEoMCwgNzAwMDAwMCwgYnkgPSAxMDAwMDAwKSkgKw0KICAjc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInR1cmJvIikgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgdmp1c3QgPSAwLjcpLA0KICAgICAgICBwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICBmaWxsID0gIiIsDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGFjcmVzIHNvd24gYnkgY3JvcCB0eXBlIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogTWluaXN0cnkgb2YgQWdyaWN1bHR1cmUsIExpdmVzdG9jayBhbmQgSXJyaWdhdGlvbiAoMjAxNSkiKQ0KDQojIGdnc2F2ZSgiYWdyaWN1bHR1cmVfYmFycGxvdC5wbmciLCBoZWlnaHQgPSA3LCB3aWR0aCA9IDExLCB1bml0cyA9ICJpbiIpDQoNCmBgYA0KDQo8YnI+DQoNClRoZSAyMDE1LzIwMTYgYWdyaWN1bHR1cmFsIGRhdGEgaXMgYWxzbyB1c2VmdWwgZm9yIGRldGVybWluaW5nIHRoZSBuZXQgbWFyZ2lucyBwZXIgYWNyZSBvZiBjcm9wIHR5cGUsIGFuZCB0aGVyZWZvcmUgdGhlIHBvdGVudGlhbCBjb3N0IG9mIGNyb3AgbG9zc2VzIGR1ZSB0byBjb25mbGljdC4NCg0KUGFkZHkgcmljZSBjcm9wcyBwcm92aWRlZCB0aGUgbG93ZXN0IG5ldCBtYXJnaW5zLiBBcmVhcyB3aXRoIGRpdmVyc2UgY3JvcHMgZW5qb3llZCBoaWdoZXIgbWFyZ2lucyBpbiAyMDE1LzIwMTYuDQoNCkFzc3VtaW5nIHRoZXNlIG1hcmdpbnMgYXJlIHN0aWxsIGFjY3VyYXRlLCBhcmVhcyBvZiBNeWFubWFyIHdpdGggZ3JlYXRlciBsZXZlbHMgb2YgY3JvcCBkaXZlcnNpZmljYXRpb24sIHN1Y2ggYXMgTWFuZGFsYXksIE1hZ3dheSBhbmQgU2FnYWluZywgaGF2ZSBsaWtlbHkgc3VmZmVyZWQgZ3JlYXRlciBlY29ub21pYyBpbXBhY3RzIGZyb20gY29uZmxpY3QgZXZlbnRzLiANCiANCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1uZXQtbWFyZ2luc30NCnZ1bG1tciAlPiUgDQogIHNlbGVjdChjb250YWlucygibmV0X21hcmdpbiIpKSAlPiUgDQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gImNyb3BfdHlwZSIsIHZhbHVlc190byA9ICJuZXRfbWFyZ2luIikgJT4lIA0KICBncm91cF9ieShjcm9wX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfiBzdW0oLngsIG5hLnJtID0gVFJVRSkpKSAlPiUgDQogIGZpbHRlcihjcm9wX3R5cGUgJW91dCUgYygiYWxsX2hhcnZlc3RlZF9uZXRfbWFyZ2luX3Blcl9jYXBpdGFfdXNkIiwgImFsbF9oYXJ2ZXN0ZWRfbmV0X21hcmdpbl91c2QiKSAmDQogICAgICAgICAgIHN0cl9kZXRlY3QoY3JvcF90eXBlLCAic2hhcmVfb2YiLCBuZWdhdGUgPSBUUlVFKSkgJT4lDQogICMgcmVjb2RpbmcgcGFkZHkgLS0gcGFkZHkgaXMganVzdCBjb2RlZCBhcyAibmV0X21hcmdpbl91c2QiDQogIG11dGF0ZShjcm9wX3R5cGUgPSByZWNvZGUoY3JvcF90eXBlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ldF9tYXJnaW5fdXNkIiA9ICJwYWRkeSIpKSAlPiUgDQogIG11dGF0ZShjcm9wX3R5cGUgPSBzdHJfcmVtb3ZlX2FsbChjcm9wX3R5cGUsICJuZXRfbWFyZ2luXyIpLCANCiAgICAgICAgIGNyb3BfdHlwZSA9IHN0cl9yZW1vdmVfYWxsKGNyb3BfdHlwZSwgIl91c2QiKSkgJT4lIA0KICBsZWZ0X2pvaW4odnVsbW1yICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoY29udGFpbnMoImhhcnZlc3RlZF9hcmVhX29mIikpICU+JSANCiAgICAgICAgICAgICAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiY3JvcF90eXBlIiwgdmFsdWVzX3RvID0gImhhcnZlc3RlZF9hcmVhIikgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGNyb3BfdHlwZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IHN1bSgueCwgbmEucm0gPSBUUlVFKSkpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUoY3JvcF90eXBlID0gc3RyX3JlbW92ZV9hbGwoY3JvcF90eXBlLCAiaGFydmVzdGVkX2FyZWFfb2ZfIiksIA0KICAgICAgICAgICAgICAgICAgICAgY3JvcF90eXBlID0gc3RyX3JlbW92ZV9hbGwoY3JvcF90eXBlLCAiX2FjcmVzIikpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGNyb3BfdHlwZSA9IHJlY29kZShjcm9wX3R5cGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91bmRfbnV0IiA9ICJncm91bmRudXQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdW5fZmxvd2VyIiA9ICJzdW5mbG93ZXJfc2VlZHMiKSksDQogICAgICAgICAgICAgIGJ5ID0gImNyb3BfdHlwZSIpICU+JSANCiAgbXV0YXRlKGNyb3BfdHlwZSA9IHN0cl90cmltKHN0cl9yZXBsYWNlX2FsbChjcm9wX3R5cGUsICJfIiwgIiAiKSksDQogICAgICAgICBjcm9wX3R5cGUgPSBzdHJfdG9fdGl0bGUoY3JvcF90eXBlKSkgJT4lIA0KICBtdXRhdGUoYEhhcnZlc3RlZCBhcmVhICVgID0gcm91bmQoaGFydmVzdGVkX2FyZWEgLyBzdW0oaGFydmVzdGVkX2FyZWEsIG5hLnJtID0gVFJVRSkgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgbWFyZ2luX3Blcl9hY3JlID0gcm91bmQobmV0X21hcmdpbiAvIGhhcnZlc3RlZF9hcmVhKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MobWFyZ2luX3Blcl9hY3JlKSkgJT4lIA0KICBmaWx0ZXIoaGFydmVzdGVkX2FyZWEgPiA2MDAwMDApICU+JSANCiAgcmVuYW1lKGBIYXJ2ZXN0ZWQgYXJlYSAoYWNyZXMpYCA9IGhhcnZlc3RlZF9hcmVhLCANCiAgICAgICAgIGBOZXQgbWFyZ2luIChVU0QpYCA9IG5ldF9tYXJnaW4sIA0KICAgICAgICAgYE1hcmdpbiBwZXIgYWNyZSAoVVNEKWAgPSBtYXJnaW5fcGVyX2FjcmUsIA0KICAgICAgICAgYENyb3AgdHlwZWAgPSBjcm9wX3R5cGUpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJOZXQgbWFyZ2luIHBlciBhY3JlIG9mIG1ham9yIGNyb3BzICgyMDE1KSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFKSAlPiUgDQogIGZvb3Rub3RlKCJEYXRhIHNvdXJjZTogTWluaXN0cnkgb2YgQWdyaWN1bHR1cmUsIExpdmVzdG9jayBhbmQgSXJyaWdhdGlvbiAoMjAxNS8yMDE2KSIsIGdlbmVyYWxfdGl0bGUgPSAiIikgDQoNCiMgJT4lIA0KIyAgIHNhdmVfa2FibGUoZmlsZSA9ICJhZ19tYXJnaW5zLnBuZyIsIHpvb20gPSAyKSANCiAgDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNy4yIENvbmZsaWN0IHNjb3JlIGFuZCBhZ3JpY3VsdHVyZQ0KDQpDb25mbGljdCBoYXMgYSByZWFsIGVmZmVjdCBvbiBmb29kIHByaWNlcywgYXMgZGVtb25zdHJhdGVkIGJ5IHRoZSBJbnRlcm5hdGlvbmFsIEZvb2QgUG9saWN5IFJlc2VhcmNoIEluc3RpdHV0ZSAoSUZQUkkpIGluIHRoZWlyIHdvcmtpbmcgcGFwZXIgW0FncmljdWx0dXJhbCB2YWx1ZSBjaGFpbnMgaW4gYSBmcmFnaWxlIHN0YXRlOiB0aGUgY2FzZSBvZiByaWNlIGluIE15YW5tYXJdKGh0dHBzOi8vd3d3LmlmcHJpLm9yZy9wdWJsaWNhdGlvbi9hZ3JpY3VsdHVyYWwtdmFsdWUtY2hhaW5zLWZyYWdpbGUtc3RhdGUtY2FzZS1yaWNlLW15YW5tYXIpLiANCg0KSUZQUkkgbm90ZWQgdGhhdCB3aGlsc3QgbmVpdGhlciBwYWRkeSBub3IgbWlsbGVkIHJpY2UgKDEwMCBrZyBvZiBoYXJ2ZXN0ZWQgcGFkZHkgeWllbGRzIGFib3V0IDY4IGtnIG1pbGxlZCByaWNlLCB3aGljaCBpcyB0aGVuIHNvbGQgb24gdG8gcmV0YWlsZXJzKSBoYWQgc2VlbiBhbnkgbWFqb3IgcHJpY2UgY2hhbmdlcyBhZnRlciB0aGUgbWlsaXRhcnkgdGFrZW92ZXIsIHRoZSByZXRhaWwgcHJpY2Ugb2YgcmljZSBoYXMgYmVlbiBub3RpY2VhYmx5IGhpZ2hlci4gU3VydmV5ZWQgZm9vZCB2ZW5kb3JzIGFsc28gcmVwb3J0ZWQgZXhwZXJpZW5jaW5nIGEgc3RlZXAgaW5jcmVhc2UgaW4g4oCcbG9jYWwgZmFybWVyIHN1cHBseSBkaWZmaWN1bHRpZXPigJ0gYW5kIOKAnG91dHNpZGUgdmlsbGFnZSBzdXBwbHkgZGlmZmljdWx0aWVz4oCdLg0KDQpUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjb25mbGljdCBpcyBpbXBhY3RpbmcgYWdyaWN1bHR1cmFsIHN1cHBseSBjaGFpbnMgYW5kIHByaWNlcy4gSW4gdG90YWwsIHJldGFpbCByaWNlIHByaWNlcyBoYXZlIGluY3JlYXNlZCAxMSBwZXIgY2VudCBzaW5jZSB0aGUgbWlsaXRhcnkgdGFrZW92ZXIuIElGUFJJIG5vdGVkIHRoYXQgMTAgYWRkaXRpb25hbCB2aW9sZW50IGV2ZW50cyBpbiB0aGUgbW9udGgtb2YgYW5kIG1vbnRoIGJlZm9yZSBhIHByaWNlIG1lYXN1cmVtZW50IHdhcyBhc3NvY2lhdGVkIHdpdGggYSAxIGFuZCAyIHBlcmNlbnQgaW5jcmVhc2UgaW4gcHJpY2UgZGlzcGVyc2lvbiwgcmVzcGVjdGl2ZWx5LCBhdCB0aGUgbWlsbCBhbmQgdmVuZG9yIGxldmVscy4gQXMgSUZQUkkgcmVwb3J0ZWQsIOKAnHRoZSBpbXBhY3Qgb2YgMTAgdmlvbGVudCBldmVudHMgaXMgYXBwcm94aW1hdGVseSBlcXVpdmFsZW50IHRvIDE2Ny0zMzMga20gb2YgZGlzdGFuY2UgYmV0d2VlbiBtaWxscyBhbmQgdmVuZG9yc+KAnS4NCg0KVGhlIHRyZWVtYXAgYmVsb3cgc2hvd3MgdGhlIGludGVyc2VjdGlvbiBvZiBhY3JlcyBvZiBsYW5kIHNvd24gYW5kIHRoZSBjb25mbGljdCBzY29yZSBjYWxjdWxhdGVkIGZyb20gQUNMRUQgZGF0YS4gVG93bnNoaXBzIGFyZSByZXByZXNlbnRlZCBieSB0aGUgc21hbGxlciByZWN0YW5nbGVzIGFuZCBhcmUgZ3JvdXBlZCBieSBzdGF0ZS9yZWdpb24uIFRoZSBhbW91bnQgb2YgYWdyaWN1bHR1cmFsIGFyZWEgc293biBpbiBhIHN0YXRlIG9yIHJlZ2lvbiBpcyByZWZsZWN0ZWQgYnkgdGhlIHNpemUgb2YgdGhlIGxhcmdlciByZWN0YW5nbGVzLiBUaGUgc2V2ZXJpdHkgb2YgY29uZmxpY3QgaW4gYSB0b3duc2hpcCBpcyBpbmRpY2F0ZWQgYnkgaXRzIGNvbG9yLiANCg0KU2FnYWluZyBhbmQgTWFnd2F5IGFyZSB0d28gb2YgdGhlIHRvcCBhcmVhcyBpbiBNeWFubWFyIGZvciBhZ3JpY3VsdHVyYWwgcHJvZHVjdGlvbiwgYW5kIHRoZWlyIHRvd25zaGlwcyB3ZXJlIG1vc3QgYWZmZWN0ZWQgYnkgY29uZmxpY3QgaW4gMjAyMS4gQWdyaWN1bHR1cmFsIGFyZWFzIGluIEF5ZXlhcndhZHksIEJhZ28sIFlhbmdvbiwgUmFraGluZSBhbmQgU2hhbiAoRWFzdCkgaGF2ZSBiZWVuIGxlc3MgYWZmZWN0ZWQgYnkgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzLCBpbmRpY2F0aW5nIHRoYXQgYWNjZXNzIHRvIGZpZWxkcyBhbmQgbWFya2V0cyBub3QgYmVlbiBkaXNydXB0ZWQgYW5kIGV4aXN0aW5nIGxpdmVsaWhvb2RzIHByb2dyYW1tZSBkZXNpZ25zIG1heSBiZSBzdWZmaWNpZW50IGluIHRoZXNlIGFyZWFzLg0KDQpFbnN1cmluZyBmb29kIHNlY3VyaXR5IGluIFNhZ2FpbmcsIE1hZ3dheSwgTWFuZGFsYXksIE1vbiwgS2F5aW4sIEthY2hpbiBhbmQgS2F5YWgsIGxpdmVsaWhvb2QgcHJvZ3JhbW1pbmcgc2hvdWxkIGJlIHByZWRpY2F0ZWQgb24gc2FmZSBhY2Nlc3MgdG8gYWdyaWN1bHR1cmFsIGxhbmQgYW5kIG1hcmtldHMuIFdoaWxlIGEgbW9yZSB0aG9yb3VnaCBhbmFseXNpcyBvZiBtYXJrZXQgYWNjZXNzIGluIHRoZXNlIGFyZWFzIGlzIHdhcnJhbnRlZCwgIGZhY2lsaXRhdGluZyBhY2Nlc3MgYmV0d2VlbiBwcm9kdWNlcnMsIG1pbGxlcnMgYW5kIHZlbmRvcnMgIHdvdWxkIGNvbnRyaWJ1dGUgdG8gdGhlIHN0YWJpbGl6YXRpb24gb2YgcHJpY2VzLiBUaGVyZSBpcyBhbHNvIGEgbmVlZCBmb3IgbWluZS1yaXNrIGVkdWNhdGlvbiBhcyBtYW55IGFyZWFzIG1pZ2h0IGJlIGNvbnRhbWluYXRlZCBieSBVWE9zLiBGb3IgcmVmZXJlbmNlLCB0aGUgbWFwIGluIHNlY3Rpb24gIFszLjRdKGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvL2V4cGxvcmF0b3J5LWRhdGEtYW5hbHlzaXMtYWNsZWQtZnNjLyNwcm9ncmVzc2lvbi1vZi1jb25mbGljdC1ldmVudHMtYnktZXZlbnQtdHlwZS1pbi0yMDIxKSB0byBzZWUgd2hlcmUgZXhwbG9zaW9ucyBhbmQgcmVtb3RlIHZpb2xlbmNlIGhhdmUgb2NjdXJyZWQuIA0KDQoNCjxicj4gDQoNCmBgYHtyIHRyZWVtYXAtY29uZmxpY3Qtc2NvcmUtYXJlYS1zb3dufQ0KdnVsbW1yICU+JSAgDQogIHNlbGVjdChhZG1pbjNfcGNvZGUgPSB0b3duc2hpcF9wY29kZSwgYXJlYV9zb3duID0gYWxsX2FyZWFfc293ZWRfbWFsaSkgJT4lIA0KICBsZWZ0X2pvaW4oY29uZmxpY3Rfc2NvcmUgJT4lIA0KICAgICAgICAgICAgc2VsZWN0KHNjb3JlX2ksIGFkbWluM19wY29kZSwgYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIA0KICAgICAgICAgICAgICAgICAgIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCBmYXRhbGl0aWVzKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBsZWZ0X2pvaW4odG93bnNoaXBzICU+JSBzZWxlY3Qoc3RhdGVfbmFtZSwgdG93bnNoaXBfbmFtZSwgYWRtaW4zX3Bjb2RlKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBtdXRhdGUoc2NvcmVfaSA9IHJlcGxhY2VfbmEoc2NvcmVfaSwgMCkpICU+JSANCiAgZ2dwbG90KGFlcyhhcmVhID0gYXJlYV9zb3duLCBmaWxsID0gc2NvcmVfaSwgc3ViZ3JvdXAgPSBzdGF0ZV9uYW1lLCANCiAgICAgICAgICAgICAjIHRoZXNlIG5leHQgYXJndW1lbnRzIGFyZSB1bm5lY2Vzc2FyeSBhcyB0aGUgZ2dwbG90bHkgZG9lc24ndCB3b3JrIGZvciB0cmVlbWFwcyANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKHRvd25zaGlwX25hbWUsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV9uYW1lLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZWFfc293bjogIiwgYXJlYV9zb3duLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhdGFsaXRpZXM6ICIsIGZhdGFsaXRpZXMsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiYmF0dGxlczogIiwgYmF0dGxlcywgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBsb3Npb25zJiByZW1vdGUgdmlvbGVuY2U6ICIsIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zOiAiLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucykpKSArDQogIGdlb21fdHJlZW1hcCgpICsNCiAgZ2VvbV90cmVlbWFwX3N1Ymdyb3VwX3RleHQocGxhY2UgPSAiY2VudHJlIiwgZ3JvdyA9IFRSVUUsIGFscGhhID0gMC41LCBjb2xvdXIgPSAiYmxhY2siLCBmb250ZmFjZSA9ICJpdGFsaWMiKSArDQogIGdlb21fdHJlZW1hcF9zdWJncm91cF9ib3JkZXIoY29sb3VyID0gIndoaXRlIiwgc2l6ZSA9IDUpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWdtYSIsIGRpcmVjdGlvbiA9IC0xKSArDQogIGxhYnMoZmlsbCA9ICJjb25mbGljdFxuc2NvcmUiLCANCiAgICAgICB0aXRsZSA9ICJUcmVlbWFwIG9mIHRvd25zaGlwcyBieSBhZ3JpY3VsdHVyYWwgYXJlYSBzb3duIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ29sb3VycyBpbmRpY2F0ZSBjb25mbGljdCBzY29yZTsgYXJlYXMgb2YgZWFjaCBzcXVhcmUgY29ycmVzcG9uZCB0byBhY3JlcyBzb3duIGJ5IHRvd25zaGlwIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQsIGFjbGVkZGF0YS5jb20gKDIwMjEpOyBNaW5pc3RyeSBvZiBBZ3JpY3VsdHVyZSBhbmQgSXJyaWdhdGlvbiAoMjAxNSkiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpgYGANCg0KPGJyPg0KDQpUaGUgbmV4dCB0cmVlbWFwIHVzZXMgdGhlIHNhbWUgYXJlYSBzY2FsZSBhcyBhYm92ZSwgIGJ1dCB0aGUgY29sb3JzIG9mIGVhY2ggdG93bnNoaXAgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gcmVmbGVjdCB0aGUgbmV0IG1hcmdpbnMgZWFybmVkIGZyb20gYWdyaWN1bHR1cmFsIHByb2R1Y3Rpb24gaW4gMjAxNS8yMDE2Lg0KDQpXaGlsZSBBeWV5YXJ3YWR5IGhhZCB0aGUgbGFyZ2VzdCBjdWx0aXZhdGVkIGFyZWEgb2YgYWxsIHRoZSBzdGF0ZXMgYW5kIHJlZ2lvbnMsIGl0cyBzaGFyZSBvZiB0aGUgbmV0IG1hcmdpbnMgcGVyIGFjcmUgdGVuZGVkIHRvIGJlIGxvd2VyIHRoYW4gaW4gbWFueSBvdGhlciBwYXJ0cyBvZiB0aGUgY291bnRyeS4gVGhpcyBpcyBsYXJnZWx5IGR1ZSB0byB0aGUgbXVjaCBoaWdoZXIgbGV2ZWxzIG9mIGNyb3AgZGl2ZXJzaWZpY2F0aW9uIGluIE1hZ3dheSBhbmQgU2FnYWluZyBvciByYXRoZXIsIHRoZSBwcmVkb21pbmFuY2Ugb2YgcGFkZHkgY3VsdGl2YXRpb24gaW4gQXlleWFyd2FkeS4gRGVzcGl0ZSB0aGUgYW5vbWFsb3VzIHBvc3QtZmxvb2QgZGF0YSBmcm9tIDIwMTUvMjAxNiwgdGhpcyBzaG93cyB0aGUgYXJlYXMgb2YgU2FnYWluZyBhbmQgTWFnd2F5IGhhdmUgdGhlIG1vc3QgdG8gbG9zZSBpbiByZWxhdGlvbiB0byBjb25mbGljdCBhbmQgY3JvcCBsb3NzZXMgb3IgZGFtYWdlLg0KDQoNCjxicj4NCg0KYGBge3IgdHJlZW1hcC1jb25mbGljdC1zY29yZS1uZXRfbWFyZ2lufQ0KdnVsbW1yICU+JSBzZWxlY3QoYWxsX25ldF9tYXJnaW4gPSBhbGxfaGFydmVzdGVkX25ldF9tYXJnaW5fdXNkLCBhbGxfYXJlYV9oYXJ2ZXN0ZWQgPSBhbGxfYXJlYXNfaGFydmVzdGVkX21hbGksIA0KICAgICAgICAgICAgICAgICAgYXJlYV9zb3duID0gYWxsX2FyZWFfc293ZWRfbWFsaSwgYWRtaW4zX3Bjb2RlID0gdG93bnNoaXBfcGNvZGUpICU+JSANCiAgbXV0YXRlKG5ldF9tYXJnaW5fYWNyZSA9IGFsbF9uZXRfbWFyZ2luIC8gYWxsX2FyZWFfaGFydmVzdGVkKSAlPiUgDQogIGxlZnRfam9pbihjb25mbGljdF9zY29yZSAlPiUgDQogICAgICAgICAgICBzZWxlY3Qoc2NvcmVfaSwgYWRtaW4zX3Bjb2RlLCBiYXR0bGVzLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgDQogICAgICAgICAgICAgICAgICAgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMsIGZhdGFsaXRpZXMpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdChzdGF0ZV9uYW1lLCB0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShzY29yZV9pID0gcmVwbGFjZV9uYShzY29yZV9pLCAwKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFyZWEgPSBhcmVhX3Nvd24sIGZpbGwgPSBuZXRfbWFyZ2luX2FjcmUsIHN1Ymdyb3VwID0gc3RhdGVfbmFtZSkpICsNCiAgZ2VvbV90cmVlbWFwKCkgKw0KICBnZW9tX3RyZWVtYXBfc3ViZ3JvdXBfdGV4dChwbGFjZSA9ICJjZW50cmUiLCBncm93ID0gVFJVRSwgYWxwaGEgPSAwLjUsIGNvbG91ciA9ICJibGFjayIsIGZvbnRmYWNlID0gIml0YWxpYyIpICsNCiAgZ2VvbV90cmVlbWFwX3N1Ymdyb3VwX2JvcmRlcihjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gNSkgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoZGlyZWN0aW9uID0gLTEsIGxhYmVscyA9IGNvbW1hKSArDQogIGxhYnMoZmlsbCA9ICJuZXQgbWFyZ2luXG5wZXIgYWNyZVxuKFVTRCkiLCANCiAgICAgICB0aXRsZSA9ICJUcmVlbWFwIG9mIHRvd25zaGlwcyBieSB0b3RhbCBuZXQgbWFyZ2lucyBvZiBhZ3JpY3VsdHVyYWwgcHJvZHVjdGlvbiIsIA0KICAgICAgIHN1YnRpdGxlID0gIkNvbG91cnMgVVNEIG5ldCBtYXJnaW5zIG9mIGFncmljdWx0dXJhbCBwcm9kdWN0aW9uIGJ5IHRvd25zaGlwO1xuQXJlYXMgb2YgZWFjaCBzcXVhcmUgY29ycmVzcG9uZCB0byBhY3JlcyBzb3duIGJ5IHRvd25zaGlwIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQsIGFjbGVkZGF0YS5jb20gKDIwMjEpOyBNaW5pc3RyeSBvZiBBZ3JpY3VsdHVyZSBhbmQgSXJyaWdhdGlvbiAoMjAxNSkiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KICANCmBgYA0KDQoNCg0KPGJyPjxicj4NCg0KIyMjIDcuMyBNYXBzIG9mIGNvbmZsaWN0IGV2ZW50cywgZmF0YWxpdGllcyBhbmQgYWdyaWN1bHR1cmFsIGFyZWEgc293biANCg0KQ2xpY2sgKipbaGVyZV0oaHR0cHM6Ly9mb29kLXNlY3VyaXR5LWNsdXN0ZXItbXlhbm1hci5naXRodWIuaW8vYWNsZWRfbWFwcy8pKiogdG8gc2VlIGludGVyYWN0aXZlIHZlcnNpb25zIG9mIHRoZXNlIG1hcHMuIFBsZWFzZSBub3RlIHRoZSBtYXBzIGFyZSBsYXJnZSBhbmQgd2lsbCB0YWtlIGEgbG9uZyB0aW1lIHRvIGxvYWQuIFN0YXRpYyB2ZXJzaW9ucyBhcmUgYmVsb3cuIA0KDQpgYGB7ciBmaWcuaGVpZ2h0ID0gMTAsIHBhdGNod29yay1hZy1jb25mbGljdC1tYXBzfQ0KDQphZ19tYWxpICU+JSANCiAgZ3JvdXBfYnkodG93bnNoaXBfcGNvZGUpICU+JSANCiAgc3VtbWFyaXNlKGFyZWFfc293biA9IG1lYW4oYWxsX2FyZWFfc293ZWRfbWFsaSkpICU+JSANCiAgc2VsZWN0KGFyZWFfc293biwgYWRtaW4zX3Bjb2RlID0gdG93bnNoaXBfcGNvZGUpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gYXJlYV9zb3duKSwgc2l6ZSA9IDAuMSkgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gYWNsZWQgJT4lIGZpbHRlcih5ZWFyID09IDIwMjEgJiBzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JSANCiAgICAgICAgICAgICAgIHNlbGVjdChsYXRpdHVkZSwgbG9uZ2l0dWRlLCBmYXRhbGl0aWVzKSwgDQogICAgICAgICAgICAgYWVzKHggPSBsb25naXR1ZGUsIHkgPSBsYXRpdHVkZSwgc2l6ZSA9IGZhdGFsaXRpZXMpLCBhbHBoYSA9IDAuNSwgY29sb3VyID0gInJlZCIpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiLCAiYmxhY2siKSkgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuMSwgMS41KSkgKw0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIGFscGhhID0gMCwgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgbGFiZWwgPSBzY2FsZXM6OmNvbW1hLCBicmVha3MgPSBjKDAsIDUwMDAwLCAyMDAwMDAsIDQwMDAwMCwgNjAwMDAwLCA3NTAwMDApKSArIA0KICBndWlkZXMoc2l6ZSA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKGZpbGwgPSAic293biBhcmVhIChhY3JlcykiLCANCiAgICAgICB0aXRsZSA9ICJDb25mbGljdCBldmVudHMgKDIwMjEpIGFuZCBhZ3JpY3VsdHVyYWwgYXJlYSBzb3duICgyMDE1KSIsDQogICAgICAgY2FwdGlvbiA9ICJBQ0xFRDsgYWNsZWRkYXRhLmNvbSAmIE1pbmlzdHJ5IG9mIEFncmljdWx0dXJlIGFuZCBJcnJpZ2F0aW9uIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKyANCiAgDQpjb25mbGljdF9zY29yZSAlPiUgDQogIGxlZnRfam9pbih0b3duc2hpcHMgJT4lIHNlbGVjdChzdGF0ZV9uYW1lLCB0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShzY29yZV9pID0gcm91bmQoc2NvcmVfaSwgZGlnaXRzID0gMikpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JQ0KICBzdF9hc19zZigpICU+JQ0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBzY29yZV9pKSwgc2l6ZSA9IDAuMSkgKw0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIGFscGhhID0gMCwgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgb3B0aW9uID0gIm1hZ21hIikgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICJDb25mbGljdCBzY29yZSIsIA0KICAgICAgIHRpdGxlID0gIkNvbmZsaWN0IHNjb3JlIGJ5IHRvd25zaGlwIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSIpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksDQogICAgICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gTkEpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpDQoNCiMgZ2dzYXZlKGZpbGVuYW1lID0gIi4vcGF0Y2h3b3JrX2FyZWFfc293bl9jb25mbGljdF9zY29yZV9tYXBzLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gMTIsIHdpZHRoID0gMTQsIHVuaXRzID0gImluIikNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMjIDguIFRleHQgbWluaW5nIGNvbmZsaWN0IGV2ZW50IGRlc2NyaXB0aW9ucw0KDQojIyMgOC4xIE5ldHdvcmsgZ3JhcGggb2YgY29uZmxpY3QgZGVzY3JpcHRpb25zDQoNCkFDTEVEIGRhdGEgY2F0YWxvZ3VlZCAxNiwyNjMgY29uZmxpY3QgZXZlbnRzIGluIE15YW5tYXIgaW4gMjAyMS4gRm9yIGVhY2ggZXZlbnQsIGEgc2VyaWVzIG9mIG5vdGVzIGlzIGxvZ2dlZCwgd2hpY2ggY29udGFpbiBhIGRlc2NyaXB0aW9uIG9mIHRoZSBldmVudC4gVGhlIGRlc2NyaXB0aW9ucyBpbmNsdWRlIGluZm9ybWF0aW9uIG9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgY29uZmxpY3QsIHRoZSBhY3RvcnMgaW52b2x2ZWQsIGFuZCB0aGUgaW1tZWRpYXRlIGltcGFjdC4gQSBzYW1wbGUgb2YgY29uZmxpY3QgZXZlbnQgZGVzY3JpcHRpb25zIGZyb20gdGhlIEFDTEVEIGRhdGFzZXQgYXJlIHNob3duIGJlbG93LiBUbyBiZXR0ZXIgdW5kZXJzdGFuZCB0aGUgZGF0YSwgZWFjaCBkZXNjcmlwdGl2ZSBwYXJhZ3JhcGggd2FzIGJyb2tlbiBkb3duIGJ5IGluZGl2aWR1YWwgd29yZHMgdG8gYmV0dGVyIGlkZW50aWZ5IGtleSB3b3JkcyBhbmQgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGVtLg0KDQoNCmBgYHtyIGV2ZW50LWRlc2NyaXB0aW9uc30NCmFjbGVkICU+JSAgDQogIGZpbHRlcihkYXRhX2lkICVpbiUgYygiNzY5NTcyOCIsICI3NzYxMjIzIiwgIjg2NTU0MjQiKSkgJT4lIA0KICBzZWxlY3QoZGF0YV9pZCwgbm90ZXMpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJFeGFtcGxlcyBvZiBjb25mbGljdCBkZXNjcmlwdGlvbnMgZnJvbSB0aGUgQUNMRUQgZGF0YXNldCIpICU+JSANCiAga2FibGVfcGFwZXIoInN0cmlwZWQiKSAlPiUgDQogIGZvb3Rub3RlKCJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIGdlbmVyYWxfdGl0bGUgPSAiIikgDQojICU+JSANCiMgIHNhdmVfa2FibGUoZmlsZSA9ICJjb25mbGljdF9kZXNjcmlwdGlvbnMucG5nIiwgem9vbSA9IDIpDQogIA0KYGBgDQoNCjxicj4NCg0KV2hlbiB0aGUgY29uZmxpY3QgZGVzY3JpcHRpb24ga2V5IHdvcmRzIGFyZSBtYXBwZWQgb250byBhIG5ldHdvcmsgZ3JhcGgsIGFzIGJlbG93LCBjbHVzdGVycyBvZiB3b3JkcyBiZWNvbWUgYXBwYXJlbnQuIE9ubHkgdGhvc2Ugd29yZHMgdGhhdCBhcHBlYXJlZCBpbiBhdCBsZWFzdCA3MCBjb25mbGljdCBkZXNjcmlwdGlvbnMsIGFuZCBoYWQgYSBjb3JyZWxhdGlvbiBvZiBhYm92ZSAwLjIgd2l0aCBhdCBsZWFzdCBvbmUgb3RoZXIgd29yZCB3ZXJlIG1hcHBlZC4NClRoZXJlIGFyZSBmb3VycyBjbHVzdGVycyBvZiB3b3JkcyBvZiBub3RlLiBUaGUgZmlyc3QgY2VudGVycyBhcm91bmQgdGhlIHdvcmQgcHJvdGVzdHMsIHRoZSBzZWNvbmQgYXJvdW5kIHByb3Rlc3QtcmVsYXRlZCB3b3JkcywgdGhlIHRoaXJkIGFyb3VuZCAqcmVtb3RlKiwgKmNvbnRyb2xsZWQqIGFuZCAqZXhwbG9zaXZlcyosIGFuZCB0aGUgZm91cnRoIGFyb3VuZCBLYWNoaW4gdG93bnNoaXAgbmFtZXMuDQoNCg0KPGJyPg0KDQpbIVtjb25mbGljdCBuZXR3b3JrIGdyYXBoXShjb25mbGljdF9uZXR3b3JrX2dyYXBoLnBuZyldKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mb29kLXNlY3VyaXR5LWNsdXN0ZXItbXlhbm1hci9leHBsb3JhdG9yeS1kYXRhLWFuYWx5c2lzLWFjbGVkLWZzYy9tYXN0ZXIvY29uZmxpY3RfbmV0d29ya19ncmFwaC5wbmcpe3RhcmdldD0iX2JsYW5rIn0NCkNsaWNrICoqW2hlcmVdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9mb29kLXNlY3VyaXR5LWNsdXN0ZXItbXlhbm1hci9leHBsb3JhdG9yeS1kYXRhLWFuYWx5c2lzLWFjbGVkLWZzYy9tYXN0ZXIvY29uZmxpY3RfbmV0d29ya19ncmFwaC5wbmcpe3RhcmdldD0iX2JsYW5rIn0qKiB0byBzZWUgdGhlIGZ1bGwtc2l6ZWQgZ3JhcGguIA0KDQo8YnI+DQoNClRoZSBmaXJzdCBjbHVzdGVyIGNlbnRlcnMgb24gdGhlIHdvcmQgcHJvdGVzdHMuIFRoZSB3b3JkIGlzIGNsb3NlbHkgbGlua2VkIHRvIG90aGVyIHdvcmRzIGluY2x1ZGluZyAqY291cCogYW5kICpkaXNvYmVkaWVuY2UqLiBMaW5rZWQgdG8gdGhpcyBjbHVzdGVyIGlzIGEgc2Vjb25kIHdoaWNoICBjb250YWlucyB0aGUgd29yZHMgKmxpdmUqLCAqcnViYmVyKiwgKmJ1bGxldHMqLCAqZGlzcGVyc2UqIGFuZCAqY3Jvd2QqLiBJdCBpcyBlYXNpbHkgc3VybWlzZWQgdGhlc2Ugd29yZHMgcmVsYXRlIHRvIGNvbmZsaWN0IGV2ZW50cyBzdXJyb3VuZGluZyB0aGUgRmVicnVhcnkgMjAyMSBtaWxpdGFyeSB0YWtlb3ZlciBhbmQgdGhlIG1hc3MgZGVtb25zdHJhdGlvbnMgaW4gcmVzcG9uc2UuIEluZGVlZCwgdGhlIHdvcmQgKkZlYnJ1YXJ5KiBpcyBhbHNvIGNsb3NlbHkgbGlua2VkIHdpdGggYm90aCBjbHVzdGVycy4NCg0KQW5vdGhlciBjbHVzdGVyIG9mIG5vdGUgY2VudGVycyBhcm91bmQgdGhlIHdvcmRzICpyZW1vdGUqLCAqY29udHJvbGxlZCogYW5kICpleHBsb3NpdmVzKi4gVGhlIGNsdXN0ZXIgaXMgY2xvc2VseSBsaW5rZWQgdG8gYSBzZWNvbmQgc2VyaWVzIG9mIHdvcmRzLCBpbmNsdWRpbmcgKmNvbnZveSosICp0cnVja3MqIGFuZCAqbGFuZG1pbmVzKi4gVGhlc2Ugd29yZCBhcmUgbGlrZWx5IGxpbmtlZCB0byBldmVudHMgd2hlcmUgbWlsaXRhcnkgY29udm95cyB3ZXJlIGJvbWJlZCBhbmQgYW1idXNoZWQgYnkgdGhlIFBlb3BsZeKAmXMgRGVmZW5jZSBGb3JjZXMuDQoNClRoZXJlIGlzIGFsc28gYSBLYWNoaW4gY2x1c3RlciBvZiB3b3JkcywgY2VudGVyZWQgYXJvdW5kIHRoZSB0b3duc2hpcCBuYW1lcyBvZiAqTXlpdGt5aW5hKiwgKldhaW5nbWF3KiwgKk1vbmh5aW4qLCAqSHBha2FudCosICpCaGFtbyosIGFzIHdlbGwgYXMgKktJQSosIHRoZSBhY3JvbnltIGZvciB0aGUgS2FjaGluIEluZGVwZW5kZW5jZSBBcm15LiBOb3RpY2VhYmx5LCB0aGlzIGNsdXN0ZXIgYWxzbyBoYXMgbGlua3Mgd2l0aCB0aGUgd29yZHMgKmJhdHRhbGlvbiosICpqZXQqIGFuZCAqZmlnaHRlcnMqLg0KDQpUaGUgcGxvdHMgYmVsb3cgc2hvdyB0aGUgdG9wIDIwIHdvcmRzICBhc3NvY2lhdGVkIHdpdGggZWFjaCB0eXBlIG9mIGNvbmZsaWN0IGV2ZW50LiBUaGVzZSBwbG90cyBwcm92aWRlIGFuIGFsdGVybmF0aXZlIHdheSBvZiByZWFkaW5nIG9yIGludGVycHJldGluZyB0aGUgd29yZCBkYXRhLiBPZiBpbnRlcmVzdCwgdGhlIHdvcmQgKmNsYXNoZWQqIGlzIG1vc3QgbGlrZWx5IHRvIGFwcGVhciBpbiBkZXNjcmlwdGlvbnMgb2YgYmF0dGxlcywgd2hpbGUgdGhlIHdvcmQgKmNvdXAqIGlzIG1vcmUgbGlrZWx5IHRvIGFwcGVhciBpbiBkZXNjcmlwdGlvbnMgb2YgcHJvdGVzdCBldmVudHMuDQogDQoNCjxicj4NCg0KYGBge3IgZmFjZXQtbG9nLW9kZHMtZXZlbnQtdHlwZSwgZmlnLmhlaWdodD02LjV9DQphY2xlZF93b3JkcyAlPiUNCiAgZmlsdGVyKHdvcmQgJW91dCUgYygiZmF0YWxpdHkiLCAiY29kZWQiLCAiZGVhdGgiLCAidmlsbGFnZSIsICJ0b3duc2hpcCIsICJkaXN0cmljdCIsICJ2aWxsYWdlcyIsDQogICAgICAgICAgICAgICAgICAgICAgInRvd24iLCAidHJhY3QiLCAiZmF0YWxpdGllcyIsICJkdmIiLCAiYWFwcCIsICJ0b3RhbCIsICJpcnJhd2FkZHkiLCAicmZhIiwgImRpZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICJraWxsaW5nIiwgImtpbGxlZCIsICJkZWFkIiwgImV2ZW50IiwgImV2ZW50cyIsICJjYXN1YWx0eSIsICJjYXN1YWx0aWVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAic2l6ZSIsICJjb2RlIiwgInJlcG9ydCIsICJteWFubWFyIiwiY29kZWQiKSkgJT4lIA0KICBtdXRhdGUoaGFzX2ZhdGFsaXRpZXMgPSBpZmVsc2UoZmF0YWxpdGllcyA+IDAsICJ5ZXMiLCAibm8iKSkgJT4lIA0KICBjb3VudChldmVudF90eXBlLCB3b3JkKSAlPiUgDQogIGJpbmRfbG9nX29kZHMoZXZlbnRfdHlwZSwgd29yZCwgbikgJT4lIA0KICBncm91cF9ieShldmVudF90eXBlKSAlPiUgDQogIHRvcF9uKDIwLCBsb2dfb2Rkc193ZWlnaHRlZCkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUod29yZCA9IHJlb3JkZXJfd2l0aGluKHdvcmQsIGxvZ19vZGRzX3dlaWdodGVkLCBldmVudF90eXBlKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBsb2dfb2Rkc193ZWlnaHRlZCwgeSA9IHdvcmQsIGZpbGwgPSBldmVudF90eXBlKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfcmVvcmRlcmVkKCkgKw0KICBmYWNldF93cmFwKH4gZXZlbnRfdHlwZSwgc2NhbGVzID0gImZyZWUiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh0aXRsZSA9ICJUb3AgMjAgd29yZHMgYnkgZXZlbnQgdHlwZSIsDQogICAgICAgc3VidGl0bGUgPSAiT2RkcyBvZiB3b3JkcyB1c2VkIHRvIGRlc2NyaWJlIGNvbmZsaWN0IGV2ZW50cyIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIsIA0KICAgICAgIHkgPSAiIikNCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyA4LjIgUGFpcndpc2UgY29ycmVsYXRpb25zIA0KDQpUbyBmdXJ0aGVyIGludGVycm9nYXRlIHRoZSBBQ0xFRCBjb25mbGljdCBkZXNjcmlwdGlvbnMsIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIGluZGl2aWR1YWwgd29yZHMgd2VyZSBhbHNvIGFzc2Vzc2VkLiBXaGVuIGEgcGFydGljdWxhciB3b3JkIGlzIG9mIGludGVyZXN0LCBpdCBtYXkgYmUgdXNlZnVsIHRvIHNlZSBpdHMgbW9zdCBsaWtlbHkgd29yZCBwYWlyLg0KDQpUaGUgdGFibGUgYmVsb3cgc2hvd3MgdGhlIDIwIG1vc3QgY29tbW9uIHdvcmQgcGFpcmluZ3MsIHdoZXJlIGVhY2ggd29yZCBoYXMgYXBwZWFyZWQgaW4gYW4gQUNMRUQgY29uZmxpY3QgZGVzY3JpcHRpb24gYXQgbGVhc3QgNTAgdGltZXMuIEEgY29ycmVsYXRpb24gb2YgMSBtZWFucyB0aGF0IHRoZSB3b3JkIGFsd2F5cyBhcHBlYXJzIHdpdGggaXRzIG1hdGNoIGluIHRoZSBkYXRhc2V0OyBhIGNvcnJlbGF0aW9uIG9mIDAuNSBtZWFucyB0aGF0IHRoZSB3b3JkIGFwcGVhcnMgaW4gdGhlIHNhbWUgZXZlbnQgYXMgaXRzIG1hdGNoIDUwIHBlcmNlbnQgb2YgdGhlIHRpbWUuDQoNCllvdSBjYW4gdXNlIHRoZSBmaWx0ZXIgYWJvdmUgdGhlIGNvbHVtbiB3b3JkIHRvIHNlZSBkaWZmZXJlbnQgd29yZCBwYWlyaW5ncy4gV2Ugc3VnZ2VzdCBzdGFydGluZyB3aXRoICphcnRpbGxlcnkqLCAqcHJvdGVzdCosICpsYW5kbWluZSogb3IgYSBsb2NhdGlvbiBvZiBpbnRlcmVzdCB0byBzZWUgaG93IHRoZSBwYWlyaW5ncyBjaGFuZ2UuIFRoZSBzZWFyY2ggYmFyIHdpbGwgc2VhcmNoIGluIGJvdGggY29sdW1ucyBhbmQgc28gbWF5IHByb3ZlIGxlc3MgdXNlZnVsIHRoYW4gdGhlIGZpbHRlciBmdW5jdGlvbi4NCg0KDQo8YnI+DQoNCmBgYHtyIGR0LXBhaXJ3aXNlLXdvcmRzfQ0KYWNsZWRfd29yZHMgJT4lICANCiAgZmlsdGVyKHdvcmQgJW91dCUgYygidG93bnNoaXAiLCAiZGlzdHJpY3QiLCAibXlhbm1hciIsICJyZWdpb24iLCAidmlsbGFnZSIsICJ0b3duIiwgInNpemUiLCAicmVwb3J0IiwgImNvZGUiLCAiY29kZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICJkdmIiLCAiYWFwcCIsICJyZmEiLCAiaXJyYXdhZGR5IikpICU+JSANCiAgZGlzdGluY3QoZGF0YV9pZCwgd29yZCkgJT4lIA0KICBhZGRfY291bnQod29yZCkgJT4lIA0KICBmaWx0ZXIobiA+PSA1MCkgJT4lIA0KICBwYWlyd2lzZV9jb3Iod29yZCwgZGF0YV9pZCwgc29ydCA9IFRSVUUpICU+JQ0KICByZW5hbWUod29yZCA9IGl0ZW0xLCBtYXRjaCA9IGl0ZW0yKSAlPiUgDQogIGdyb3VwX2J5KHdvcmQpICU+JSANCiAgdG9wX24oY29ycmVsYXRpb24sIG4gPSAyMCkgJT4lIA0KICBkYXRhdGFibGUoZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwgDQogICAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoID0gbGlzdChyZWdleCA9IFRSVUUpDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29tcGxldGUgPSBodG1sd2lkZ2V0czo6SlMoDQogICMgICAgICAgICJmdW5jdGlvbihzZXR0aW5ncywganNvbikgeyIsDQogICMgICAgICAgIHBhc3RlMCgiJCh0aGlzLmFwaSgpLnRhYmxlKCkuY29udGFpbmVyKCkpLmNzcyh7J2ZvbnQtc2l6ZSc6ICciLCAiOC41cHQiLCAiJ30pOyIpLA0KICAjICAgICAgICAifSIpDQogICAgICAgKSwNCiAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjpibGFjazsgZm9udC1zaXplOjE0MCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGFpcndpc2UgY29ycmVsYXRpb25zIGluIGNvbmZsaWN0IGV2ZW50IGRlc2NyaXB0aW9ucyIpDQogICAgICkgJT4lIA0KICBmb3JtYXRSb3VuZChjKCJjb3JyZWxhdGlvbiIpLCBkaWdpdHMgPSAzKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDguMyBGYXRhbGl0aWVzIGFuZCB3b3JkIGNvcnJlbGF0aW9ucw0KDQpBbm90aGVyIHdheSB0byBpbnRlcnByZXQgdGhlIEFDTEVEIGRlc2NyaXB0aW9uIGRhdGEgdGhyb3VnaCB3b3JkIGFzc29jaWF0aW9ucywgaXMgdG8gbG9vayBhdCB0aGUgd29yZHMgdXNlZCB0byBkZXNjcmliZSBjb25mbGljdCBldmVudHMgdGhhdCByZXN1bHRlZCBpbiBmYXRhbGl0aWVzLg0KDQpUaGUgcGxvdHMgYmVsb3cgc2hvdyB0aGUgdG9wIDMwIHdvcmRzIGFzc29jaWF0ZWQgd2l0aCBjb25mbGljdCBldmVudHMgdGhhdCBlaXRoZXIgcmVzdWx0ZWQgaW4gZmF0YWxpdGllcyAoc2hvd24gaW4gcmVkKSwgb3IgZGlkIG5vdCAoc2hvd24gaW4gYmx1ZSkuDQoNCkluIGVhY2ggcGxvdCwgdGhlIG1vc3QgY29tbW9uIHdvcmRzIGFyZSByYW5rZWQgIGluIHRlcm1zIG9mIGhvdyBvZnRlbiB0aGV5IGFyZSB1c2VkIHRvIGRlc2NyaWJlIGEgY29uZmxpY3QgZXZlbnQgdGhhdCBkaWQgb3IgZGlkIG5vdCByZXN1bHQgaW4gZmF0YWxpdGllcy4NCg0KT2YgaW50ZXJlc3QsIHdoZW4gYSBmYXRhbCBjb25mbGljdCBpcyBkZXNjcmliZWQsIHRoZSBkZXNjcmlwdGlvbiBtb3N0IG9mdGVuIHVzZXMgdGhlIHdvcmRzICpzaG90KiwgKnNvbGRpZXJzKiwgKmluanVyZWQqLCAqUERGKiBhbmQgKm1pbGl0YXJ5Ki4gSW4gY29udHJhc3QsIHRoZSB3b3JkcyAqZGlzcGxhY2VtZW50KiwgKmNoYW5nZSosICpmb3JtZWQqLCAqYXJyZXN0ZWQqIGFuZCAqb2ZmaWNlcyogd2VyZSBtb3N0IGxpa2VseSB0byBiZSB1c2VkIHRvIGRlc2NyaWJlIGV2ZW50cyB0aGF0IGRpZCBub3QgcmVzdWx0IGluIGZhdGFsaXRpZXMuIA0KIA0KQW4gaW50ZXJlc3RpbmcgbmV4dCBzdGVwIGluIHVuZGVyc3RhbmRpbmcgdGhlIGRlc2NyaXB0aXZlIGRhdGEgbWlnaHQgYmUgdG8gdHJ5IGFuZCBkZXZlbG9wIGEgcHJlZGljdGl2ZSBtb2RlbCBiYXNlZCBvbiB0aGUgY29uZmxpY3QgZGVzY3JpcHRpb25zIHRvIGJldHRlciB1bmRlcnN0YW5kIHdoaWNoIHR5cGVzIG9mIGV2ZW50cyBhcmUgbW9yZSBsaWtlbHkgdG8gcmVzdWx0IGluIGZhdGFsaXRpZXMuDQoNCjxicj4NCg0KYGBge3IgZmFjZXRfaGFzX2ZhdGFsaXRpZXMsIGZpZy5oZWlnaHQgPSA2fQ0KYWNsZWRfd29yZHMgJT4lDQogIGZpbHRlcihzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JSANCiAgZmlsdGVyKHdvcmQgJW91dCUgYygiZmF0YWxpdHkiLCAiY29kZWQiLCAiZGVhdGgiLCAidmlsbGFnZSIsICJ0b3duc2hpcCIsICJkaXN0cmljdCIsICJ2aWxsYWdlcyIsDQogICAgICAgICAgICAgICAgICAgICAgInRvd24iLCAidHJhY3QiLCAiZmF0YWxpdGllcyIsICJkdmIiLCAiYWFwcCIsICJ0b3RhbCIsICJpcnJhd2FkZHkiLCAicmZhIiwgImRpZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICJraWxsaW5nIiwgImtpbGxlZCIsICJkZWFkIiwgImV2ZW50IiwgImV2ZW50cyIsICJjYXN1YWx0eSIsICJjYXN1YWx0aWVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAic2l6ZSIsICJjb2RlIiwgInJlcG9ydCIsICJteWFubWFyIiwiY29kZWQiKSkgJT4lIA0KICBtdXRhdGUoaGFzX2ZhdGFsaXRpZXMgPSBpZmVsc2UoZmF0YWxpdGllcyA+IDAsICJ5ZXMiLCAibm8iKSwNCiAgICAgICAgIGhhc19mYXRhbGl0aWVzID0gZmN0X3JldihoYXNfZmF0YWxpdGllcykpICU+JSANCiAgY291bnQoaGFzX2ZhdGFsaXRpZXMsIHdvcmQpICU+JSANCiAgYmluZF9sb2dfb2RkcyhoYXNfZmF0YWxpdGllcywgd29yZCwgbikgJT4lIA0KICBncm91cF9ieShoYXNfZmF0YWxpdGllcykgJT4lIA0KICB0b3BfbigzMCwgbG9nX29kZHNfd2VpZ2h0ZWQpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHdvcmQgPSByZW9yZGVyX3dpdGhpbih3b3JkLCBsb2dfb2Rkc193ZWlnaHRlZCwgaGFzX2ZhdGFsaXRpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGxvZ19vZGRzX3dlaWdodGVkLCB5ID0gd29yZCwgZmlsbCA9IGhhc19mYXRhbGl0aWVzKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfcmVvcmRlcmVkKCkgKw0KICBmYWNldF93cmFwKH4gaGFzX2ZhdGFsaXRpZXMsIHNjYWxlcyA9ICJmcmVlIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGxhYnModGl0bGUgPSAiVG9wIDMwIHdvcmRzIGJ5IHdoZXRoZXIgdGhlIGV2ZW50IHJlc3VsdGVkIGluIGZhdGFsaXRpZXMiLA0KICAgICAgIHN1YnRpdGxlID0gIk9kZHMgb2Ygd29yZHMgdXNlZCB0byBkZXNjcmliZSBjb25mbGljdCBldmVudHMgd2l0aCBhbmQgd2l0aG91dCBmYXRhbGl0aWVzIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgICB5ID0gIiIpDQpgYGANCg0KDQo8YnI+PGJyPg0KDQojIyMgOC40IFNvdXJjZXMgdXNlZCBieSB0aGUgQUNMRUQgZGF0YXNldA0KDQoNCmBgYHtyIHNvdXJjZXMtZGZ9DQoNCmFjbGVkX3NvdXJjZSA8LSBhY2xlZCAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgc2VwYXJhdGUoc291cmNlLCBzZXAgPSAiOyAiLCBpbnRvID0gcGFzdGUoInYiLCAxOjQsIHNlcCA9ICJfIikpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHZfMTp2XzQpLCBuYW1lc190byA9ICJpZ25vcmUiLCB2YWx1ZXNfdG8gPSAic291cmNlX2xvbmciKSAlPiUgDQogIGZpbHRlcighaXMubmEoc291cmNlX2xvbmcpKQ0KDQpgYGANCg0KSW4gbW9zdCBjYXNlcywgdGhlIEFDTEVEIGRhdGFzZXTigJlzIGRlc2NyaXB0aW9ucyBvZiBlYWNoIGNvbmZsaWN0IGV2ZW50IGNvbWVzIGZyb20gbmV3cyBzb3VyY2VzLg0KDQpBIHRvdGFsIG9mIGByIGFjbGVkX3NvdXJjZSAlPiUgZGlzdGluY3Qoc291cmNlX2xvbmcpICU+JSBucm93YCBuZXdzIHNvdXJjZXMgd2VyZSB1c2VkIGluIHRoZSBBQ0xFRCBNeWFubWFyIGRhdGFzZXQuIEFib3V0IG9uZSB0aGlyZCBvZiB0aGUgY29uZmxpY3QgZXZlbnRzIGluY2x1ZGVkIGluIHRoZSBBQ0xFRCBkYXRhc2V0IGZvciAyMDIxIHdlcmUgb3JpZ2luYWxseSByZXBvcnRlZCBpbiB0aGUgW0RlbW9jcmF0aWMgVm9pY2Ugb2YgQnVybWFdKGh0dHBzOi8vZW5nbGlzaC5kdmIubm8vKS4gVGhlIG1vc3QgY29tbW9uIG5ld3Mgc291cmNlcyBhcmUgbGlzdGVkIGluIHRoZSB0YWJsZSBiZWxvdy4gVGhleSBhcmUgcmFua2VkIGJ5IG9yZGVyIG9mIHRoZSBzaGFyZSBvZiAyMDIxIGNvbmZsaWN0IGV2ZW50cyBhdHRyaWJ1dGVkIHRvIHRoZW0uDQoNCjxicj4NCg0KYGBge3Igc291cmNlcy1iYXJwbG90fQ0KDQphY2xlZF9zb3VyY2UgJT4lIA0KICBtdXRhdGUoc291cmNlX2xvbmcgPSBmY3RfbHVtcChzb3VyY2VfbG9uZyAlPiUgYXMuZmFjdG9yLCBuPTIwKSkgJT4lIA0KICBjb3VudChzb3VyY2VfbG9uZywgc29ydCA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHNvdXJjZV9sb25nID0gZmN0X3Jlb3JkZXIoc291cmNlX2xvbmcsIG4pLCANCiAgICAgICAgIHBjX29mX3RvdGFsID0gbiAvIHN1bShuKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwY19vZl90b3RhbCwgeSA9IHNvdXJjZV9sb25nLCBmaWxsID0gc291cmNlX2xvbmcpKSArDQogIGdlb21fY29sKCkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIGJyZWFrcyA9IHNlcSgwLCAwLjM4LCBieSA9IDAuMDUpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyANCiAgbGFicyh4ID0gIlBlcmNlbnRhZ2Ugb2YgY29uZmxpY3QgZXZlbnRzIHJlcG9ydGVkIGJ5IHNvdXJjZSIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiTW9zdCBjb21tb24gZGF0YSBzb3VyY2VzIGluIDIwMjEgaW4gdGhlIEFDTEVEIGRhdGFzZXQiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2VzIG91dHNpZGUgb2YgdGhlIHRvcCAyMCB3ZXJlIHJlY29kZWQgYXMgJ090aGVyJyIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KICAgICAgICANCmBgYA0KDQo8YnI+DQoNCkFzIGEgcG9pbnQgb2YgY29tcGFyaXNvbiwgQUNMRUTigJlzIG1ldGhvZG9sb2d5IGFuZCBkYXRhc2V0IHdhcyBkaXNjdXNzZWQgd2l0aCB0aGUgTmV4dXMgUmVzcG9uc2UgTWVjaGFuaXNt4oCZcyAoTlJNKSBDb25mbGljdCBBbmFseXNpcyBhbmQgUmVzZWFyY2ggRmFjaWxpdHksIHdoaWNoIGFsc28gbWFpbnRhaW5zIGl0cyBvd24gZGF0YXNldCBvZiBjb25mbGljdCBldmVudHMuIEl0IHdhcyBub3RlZCB0aGF0IHRoZSB0d28gZGF0YXNldHMgYXJlIHZlcnkgc2ltaWxhciwgYm90aCByZWx5aW5nIGxhcmdlbHkgb24gbWVkaWEgc291cmNlcywgd2l0aCB0aGUgb25seSBleGNlcHRpb24gYmVpbmcgdGhlIGluY2x1c2lvbiBvZiBzb2NpYWwgbWVkaWEgcG9zdHMgaW4gdGhlIE5STSBkYXRhc2V0LiBUaGUgRlNDIHdpbGwgY29udGludWUgdG8gdXNlIEFDTEVEIGRhdGEgZm9yIGFuYWx5c2lzIGdvaW5nIGZvcndhcmQgYXMgaXQgaXMgZnJlZSBhbmQgcHVibGljbHkgYXZhaWxhYmxlLiANCg0KPGJyPjxicj48YnI+DQoNCiMjIDkuIE5leHQgc3RlcHMNCg0KVGhlIEFDTEVEIGRhdGEgaXMgYW4gaW1wb3J0YW50IHNvdXJjZSBvZiBkYXRhIGZvciBiZXR0ZXIgdW5kZXJzdGFuZGluZyB0aGUgc2NvcGUgbmF0dXJlIG9mIGNvbmZsaWN0IGluIE15YW5tYXIuIEhvd2V2ZXIsIG1vcmUgY2FuIGJlIGRvbmUgdG8gaW50ZXJyb2dhdGUgaG93IGNvbmZsaWN0IGltcGFjdHMgZm9vZCBzZWN1cml0eSBpbiB0aGUgY291bnRyeS4gRnVydGhlcm1vcmUsIHRoZSBpbmNpZGVuY2Ugb2YgY29uZmxpY3QsIHRvLWRhdGUsIGhhcyBub3QgYmVlbiB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBhbGxvY2F0aW5nIHJlc291cmNlcyBpbiBmb29kIHNlY3VyaXR5IHByb2dyYW1taW5nIGFuZCBpdCBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgcHJlc2VudGVkIGluIHRoaXMgcmVwb3J0IGFyZSB1c2VkIHRvIGluZm9ybSBwcm9ncmFtbWF0aWMgYW5kIG9wZXJhdGlvbmFsIGRlY2lzaW9uIG1ha2luZy4gDQoNClRvIGJldHRlciB1bmRlcnN0YW5kIGltcGFjdCBvZiBjb25mbGljdCBvbiBmb29kIHNlY3VyaXR5LCB0aGUgZm9sbG93aW5nIHN0ZXBzIGFyZSByZWNvbW1lbmRlZC4NCg0KMS4gUmV2aWV3IGFsbCBmaW5kaW5ncyB3aXRoIG90aGVyIGh1bWFuaXRhcmlhbiBzdGFrZWhvbGRlcnMgYW5kIGRldmVsb3AgYXJlYS1zcGVjaWZpYyBwcm9kdWN0cywgYXMgbmVjZXNzYXJ5LiBUaGUgY29uZmxpY3Qgc2NvcmUgdGhhdCBoYXMgYmVlbiBjYWxjdWxhdGVkIGlzIGFuIGltcG9ydGFudCB0b29sIGZvciBnZW9ncmFwaGljIHByaW9yaXRpemF0aW9uIGFuZCBmb29kIHNlY3VyaXR5IHBhcnRuZXJzIHNob3VsZCBiZSBvcmllbnRlZCBvbiBpdHMgdXNlLiBUaGUgZGF0YSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb25mbGljdCBzY29yZSBpcyBib3RoIGVhc2lseSBhY2Nlc3NpYmxlIGFuZCByZWd1bGFybHkgdXBkYXRlZCwgdGhvdWdoIGl0IHJlbWFpbnMgdG8gYmUgc2VlbiB0byB3aGF0IGV4dGVudCB0aGlzIGlzIHRydWUgZm9yIGRhdGEgb24gZGlzcGxhY2VtZW50LiANCg0KMi4gUmUtY2FsY3VsYXRlIHRoZSBjb25mbGljdCBzY29yZSBvbmNlIHVwZGF0ZWQgSURQIGRhdGEgaXMgb2J0YWluZWQgYW5kIGNvbXBhcmUgdGhlc2UgcmVzdWx0cyB0byBwcmV2aW91cyByZXN1bHRzIHJlY29yZGVkIGJ5IE1JTVUtSEFSUCBpbiB0aGVpciB2dWxuZXJhYmlsaXR5IGFuYWx5c2lzLiBUbyBub3RlLCBkaXNwbGFjZW1lbnQgaXMgbGlrZWx5IHRvIGJlIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggdGhlIG90aGVyIGNvbmZsaWN0IGluZGljYXRvcnMgKHRoaXMgd2FzIHRoZSBjYXNlIHdpdGggdGhlIE1JTVUtSEFSUCBjb25mbGljdCBpbmRleCkuIE5ldmVydGhlbGVzcywgaXQgd2FzIGEga2V5IGNvbXBvbmVudCBvZiB0aGUgTUlNVS1IQVJQIG1vZGVsIGFuZCBpdHMgaW5jbHVzaW9uIHdpbGwgYWlkIGluIGltcHJvdmluZyBjb21wYXJhYmlsaXR5Lg0KDQozLglDb21wYXJlIGNvbmZsaWN0IHNjb3JlcyBhbmQgY29uZmxpY3QgaW5kaWNhdG9ycyB0byB0aGUgcmVzdWx0cyBvZiB0aGUgV0ZQLUZBTyBmb29kIGluc2VjdXJpdHkgc3VydmV5LiBJdCB3aWxsIGJlIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIGlmIHRoZXJlIGFyZSBhbnkgc2lnbmlmaWNhbnQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIHNjb3JlcyBhbmQgcmVzdWx0cy4gRnVydGhlciwgdGhlIHR3byBkYXRhc2V0cyBjb3VsZCBiZSBmaWx0ZXJlZCB0byBvbmx5IGluY2x1ZGUgdGltZSBwZXJpb2RzIHJlbGV2YW50IHRvIHRoZSBXRlAtRkFPIHN0dWR5LiBBZGRpdGlvbmFsbHksIGNvbmZsaWN0IHNjb3JlcyBjb3VsZCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggbWFya2V0IHByaWNlcyB0byBzZWUgaWYgYSBwcmVkaWN0aXZlIG1vZGVsIGNhbiBiZSBlc3RhYmxpc2hlZC4gQ29uZmxpY3QgZGF0YSBzaG91bGQgYWxzbyBiZSBtYXBwZWQgYWdhaW5zdCBkYXRhIG9uIG1hbG51dHJpdGlvbi4gV2hpbGUgdGhlcmUgd2lsbCBsaWtlbHkgYmUgbWFueSBjaGFsbGVuZ2VzIGluIG9idGFpbmluZyBhY2N1cmF0ZSBtb3J0YWxpdHkgcmF0ZXMsIHRoZSBpbXBhY3Qgb2YgY29uZmxpY3Qgb24gbWFsbnV0cml0aW9uIHNob3VsZCBiZSBiZXR0ZXIgdW5kZXJzdG9vZC4gDQoNCjQuCUNvbXBhcmUgY29uZmxpY3QgaW5kaWNhdG9ycyB0byBtYXJrZXQgcHJpY2VzIHRvIHdoZXRoZXIgY29uZmxpY3QgZXZlbnRzIGhhdmUgaGFkIGFuIGltcGFjdCBvbiBmb29kIHByaWNlcyBhbmQgcHJpY2Ugc3RhYmlsaXR5LiBBZ2FpbiwgYSBwcmVkaWN0aXZlIG1vZGVsIGNvdWxkIGJlIGRldmVsb3BlZCBmcm9tIHRoaXMgY29tcGFyaXNvbi4NCg0KNS4JQ29tcGFyZSBBQ0xFRCBkYXRhIGFnYWluc3QgTUlNVeKAmXMgaGFyZC10by1yZWFjaCBhcmVhcyBkYXRhc2V0Lg0KDQo2LglDcm9zcy1yZWZlcmVuY2UgY29uZmxpY3QgZGF0YSB3aXRoIHBhcnRuZXIgcHJlc2VuY2UgYW5kIGFjaGlldmVtZW50cyBvZiBvdGhlciBjbHVzdGVycy4NCg0KPGJyPjxicj48YnI+DQoNCg0KIyMgMTAuIFJlZmVyZW5jZSBtYXBzIGFuZCB0YWJsZXMNCg0KDQojIyMgMTAuMSBDb25mbGljdCBldmVudHMgaW4gMjAyMSBhZ2dyZWdhdGVkIGF0IHRvd25zaGlwIGxldmVsIA0KDQpgYGB7ciBEVC1ieS10b3duc2hpcH0NCmFjbGVkICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhZG1pbjEsIGFkbWluMywgYWRtaW4zX3Bjb2RlKSAlPiUgDQogIGNvdW50KGV2ZW50X3R5cGUpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGV2ZW50X3R5cGUsIHZhbHVlc19mcm9tID0gbikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgbXV0YXRlKHRvdGFsX2V2ZW50cyA9IHJvd1N1bXMoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgfiBzdW0oLngsIG5hLnJtID0gVFJVRSkpICU+JSAgDQogIGxlZnRfam9pbihhY2xlZCAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lDQogIGxlZnRfam9pbihmc2MgJT4lICANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0odV9iZW4pKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICByZXBsYWNlX25hKGxpc3QocGFydG5lcnMgPSAwLCBiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgc2VsZWN0KHN0YXRlID0gYWRtaW4xLCB0b3duc2hpcCA9IGFkbWluMywgdG90YWxfZXZlbnRzLCBmYXRhbGl0aWVzLCBiYXR0bGVzLCBleHBsb3Npb25zX3JlbW90ZSA9IGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLCBwcm90ZXN0cywNCiAgICAgICAgIHN0cmF0ZWdpY19kZXYgPSBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzLCB2aW9sZW5jZV9jaXZpbGlhbnMgPSB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgcmlvdHMsIHBhcnRuZXJzLCANCiAgICAgICAgIGJlbmVmaWNpYXJpZXMsIGFkbWluM19wY29kZSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfZXZlbnRzKSkgJT4lIA0KICBkYXRhdGFibGUoZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUNCiAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbXBsZXRlID0gaHRtbHdpZGdldHM6OkpTKA0KICAgICAgICAgIyAiZnVuY3Rpb24oc2V0dGluZ3MsIGpzb24pIHsiLA0KICAgICAgICAgIyBwYXN0ZTAoIiQodGhpcy5hcGkoKS50YWJsZSgpLmNvbnRhaW5lcigpKS5jc3Moeydmb250LXNpemUnOiAnIiwgIjguNXB0IiwgIid9KTsiKSwNCiAgICAgICAgICMgIn0iKSksDQogICAgICAgICAgICApLA0KICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6YmxhY2s7IGZvbnQtc2l6ZToxNDAlIDsnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMjEgY29uZmxpY3QgZXZlbnRzIGJ5IHRvd25zaGlwIikpICU+JSANCiAgZm9ybWF0Um91bmQoYygiYmVuZWZpY2lhcmllcyIpLCBkaWdpdHMgPSAwKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDEwLjIgQ29uZmxpY3QgYWN0b3JzIGluIDIwMjENCg0KYGBge3IgRFQtY29uZmxpY3QtYWN0b3JzfQ0KYWN0b3JzICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAyMSkgJT4lIA0KICBncm91cF9ieShhY3Rvcl9zaW1wbGUsIGFjdG9yX3R5cGUgPSBpbnRlcjEsIGV2ZW50X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZXZlbnRfdHlwZSwgdmFsdWVzX2Zyb20gPSBjb3VudCkgJT4lICBjbGVhbl9uYW1lcygpICU+JSANCiAgbXV0YXRlKHRvdGFsX2V2ZW50cyA9IHJvd1N1bXMoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSwgbmEucm0gPSBUUlVFKSkgJT4lDQogIGxlZnRfam9pbihhY3RvcnMgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFjdG9yX3NpbXBsZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSksIGJ5ID0gImFjdG9yX3NpbXBsZSIpICU+JQ0KICByZW5hbWUoYWN0b3JfbmFtZSA9IGFjdG9yX3NpbXBsZSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgPSAwLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucyA9IDAsIGJhdHRsZXMgPSAwLCBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzID0gMCwgDQogICAgICAgICAgICAgICAgICByaW90cyA9IDAsIHByb3Rlc3RzID0gMCkpICU+JQ0KICBzZWxlY3QoYWN0b3JfbmFtZSwgYWN0b3JfdHlwZSwgdG93bnNoaXBzLCBmYXRhbGl0aWVzLCB0b3RhbF9ldmVudHMsIGJhdHRsZXMsIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgcmlvdHMsDQogICAgICAgICBwcm90ZXN0cywgc3RyYXRlZ2ljX2RldmVsb3BtZW50cykgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfZXZlbnRzKSkgJT4lDQogIGRhdGF0YWJsZShmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRQ0KICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29tcGxldGUgPSBodG1sd2lkZ2V0czo6SlMoDQogICAgICAgICAjICJmdW5jdGlvbihzZXR0aW5ncywganNvbikgeyIsDQogICAgICAgICAjIHBhc3RlMCgiJCh0aGlzLmFwaSgpLnRhYmxlKCkuY29udGFpbmVyKCkpLmNzcyh7J2ZvbnQtc2l6ZSc6ICciLCAiOC41cHQiLCAiJ30pOyIpLA0KICAgICAgICAgIyAifSIpKSwNCiAgICAgICAgICAgICksDQogICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOmJsYWNrOyBmb250LXNpemU6MTQwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDIxIGNvbmZsaWN0IGFjdG9ycyIpKSAlPiUNCiAgZm9ybWF0Um91bmQoYygiZmF0YWxpdGllcyIsICJ0b3RhbF9ldmVudHMiLCAiYmF0dGxlcyIsICJ2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucyIsICJleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSIsIA0KICAgICAgICAgICAgICAgICJwcm90ZXN0cyIsICJzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzIiksIGRpZ2l0cyA9IDApICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODUlIiwgZm9udFNpemUgPSAiODAlIikNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KDQojIyMgMTAuMyBSZWZlcmVuY2UgbWFwcw0KDQpgYGB7ciBwYXRjaHdvcmstbWFwcywgZmlnLmhlaWdodD0xNn0gDQphY2xlZCAlPiUgIA0KICBmaWx0ZXIoeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3RzIikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JQ0KICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSANCiAgZnVsbF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gY291bnQpLCBzaXplID0gMC4xKSArDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgc2l6ZSA9IDAuNSwgY29sb3VyID0gImJsYWNrIiwgYWxwaGEgPSAwKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKHRpdGxlID0gIkNvbmZsaWN0IGV2ZW50cyBieSB0b3duc2hpcCAyMDIxIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJQZWFjZWZ1bCBwcm90ZXN0cyBoYXZlIGJlZW4gZXhjbHVkZWQiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFDTEVEOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgICBmaWxsID0gImNvbmZsaWN0IGV2ZW50cyIpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChoanVzdCA9IDAuMikpICsNCiAgDQpmc2MgJT4lDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBwYXJ0bmVycyksIHNpemUgPSAwLjEpICsNCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBzaXplID0gMC41LCBjb2xvdXIgPSAiYmxhY2siLCBhbHBoYSA9IDApICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEsIGJyZWFrcyA9IGMoMSwgMywgNiwgOSwgMTIpKSArIA0KICB0aGVtZV92b2lkKCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBmb29kIHNlY3VyaXR5IHBhcnRuZXJzIGluIDIwMjEiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBNeWFubWFyIiwNCiAgICAgICBmaWxsID0gIm51bWJlciBvZlxucGFydG5lcnMiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjIpKSArIA0KICANCmFjbGVkICU+JSAgDQogIGZpbHRlcih5ZWFyID09IDIwMjEpICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpKSAlPiUgDQogIG5hX2lmKDApICU+JSANCiAgZnVsbF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gZmF0YWxpdGllcyksIHNpemUgPSAwLjEpICsNCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBzaXplID0gMC41LCBjb2xvdXIgPSAiYmxhY2siLCBhbHBoYSA9IDApICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnModGl0bGUgPSAiQ29uZmxpY3QgZmF0YWxpdGllcyBieSB0b3duc2hpcCAyMDIxIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSIsDQogICAgICAgZmlsbCA9ICJmYXRhbGl0aWVzIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC4yKSkgKw0KICANCmZzYyAlPiUNCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUNCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odV9iZW4pLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGJlbmVmaWNpYXJpZXMpLCBzaXplID0gMC4xKSArDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgc2l6ZSA9IDAuNSwgY29sb3VyID0gImJsYWNrIiwgYWxwaGEgPSAwKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xLCBiZWdpbiA9IDAuMiwgdHJhbnMgPSAibG9nMTAiKSArIA0KICB0aGVtZV92b2lkKCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBmb29kIHNlY3VyaXR5IGJlbmVmaWNpYXJpZXMgaW4gMjAyMSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogRm9vZCBTZWN1cml0eSBDbHVzdGVyIE15YW5tYXIiLA0KICAgICAgIGZpbGwgPSAibnVtYmVyIG9mXG5iZW5lZmljaWFyaWVzIikgKw0KICB0aGVtZShwbG90LmNhcHRpb249ZWxlbWVudF90ZXh0KGhqdXN0ID0gMC4yKSkNCg0KYGBgDQoNCkludGVyYWN0aXZlIHZlcnNpb25zIG9mIHNvbWUgb2YgdGhlc2UgbWFwcyBjYW4gYmUgZm91bmQgKipbaGVyZV0oaHR0cHM6Ly9mb29kLXNlY3VyaXR5LWNsdXN0ZXItbXlhbm1hci5naXRodWIuaW8vYWNsZWRfbWFwcy8pKiouIFBsZWFzZSBub3RlIHRoYXQgdGhlIG1hcHMgYXJlIGxhcmdlIGFuZCB3aWxsIHRha2UgYSBsb25nIHRpbWUgdG8gbG9hZC4gDQoNCg==